2010-01-11 16 views
64

Tengo un UIImageView que quiero agregar una sombra detrás. Desearía que Apple tuviera eso como una propiedad, pero tienen que hacer muchas cosas difíciles para los programadores, así que tengo que hacer esta pregunta.¿Cuál es la mejor manera de crear una sombra detrás de un UIImageView

+1

Probablemente, desea utilizar las funciones de dibujo de Core Graphics para dibujar la sombra. –

+0

Estas preguntas son muy similares a las tuyas: http://stackoverflow.com/questions/962827/uiimage-shadow, http://stackoverflow.com/questions/1943087/i-am-trying-to-add-a-drop -shadow-a-a-uimageview –

Respuesta

195

Hay una manera mejor y más fácil de hacer esta. UIImageView hereda de UIView para que tenga una propiedad de capa. Puedes acceder a las propiedades de sombra de la capa y bam, tienes una sombra.

Si tiene el UIImageView como un IBOutlet en un archivo de punta, puede implementar el awakeFromNib por ejemplo.

Objective-C

- (void)awakeFromNib { 
    imageView.layer.shadowColor = [UIColor purpleColor].CGColor; 
    imageView.layer.shadowOffset = CGSizeMake(0, 1); 
    imageView.layer.shadowOpacity = 1; 
    imageView.layer.shadowRadius = 1.0; 
    imageView.clipsToBounds = NO; 
} 

No se olvide de #import "QuartzCore/CALayer.h"


Para Swift, que puede ir sobre él de varias maneras. Cree una extensión de clase, una subclase o una instancia de imageView. Cualquiera que sea el camino, el proceso es el mismo al modificar la propiedad de sombra de las capas.

Swift 3

override func awakeFromNib() { 
    super.awakeFromNib() 

    imageView.layer.shadowColor = UIColor.purple.cgColor 
    imageView.layer.shadowOffset = CGSize(width: 0, height: 1) 
    imageView.layer.shadowOpacity = 1 
    imageView.layer.shadowRadius = 1.0 
    imageView.clipsToBounds = false 
} 
+27

También puede necesitar 'imageView.clipsToBounds = NO;' o la sombra se recortará. – mxcl

+0

sí, tienes razón. no lo olvides! –

+18

también necesitará importar # QuartzCore/CALayer.h " – dev

10

Lo más sencillo que hacer es añadir una capa de sombra a su vista de la imagen:

CALayer    *layer = [CALayer layer]; 
CGRect    bounds = self.bounds; 

layer.bounds = bounds; 
layer.position = CGPointMake(bounds.size.width/2 + 3, bounds.size.height/2 + 3); 
layer.backgroundColor = [UIColor colorWithWhite: 0.25 alpha: 0.55].CGColor; 
layer.zPosition = -5; 

[self.layer addSublayer: layer]; 

Asegúrese "Clip subvistas" está desactivado para la vista

+1

¿por qué haces un CGRect * límites cuando puedes simplemente establecer los límites de la capa en self.bounds? ¿Y dónde entra la sombra? – Jaba

+0

Creo una variable de temperatura para legibilidad; tipear self.bounds es un poco más largo que los límites, y hace que el código sea un poco menos legible. Esta capa ES la sombra. Por supuesto, esto presupone que tienes una imagen cuadrada; si está haciendo una imagen no rectangular, tendrá que usar una máscara de imagen personalizada. –

+0

Bueno, quiero que se desvanezca y no sé cómo lo haría. ¡Ayuda! – Jaba

4

en adicional para que, si se desea realizar borde blanco y la sombra puede utilizar ese código:

//shadow part 
imageView.layer.shadowColor = [UIColor blackColor].CGColor; 
imageView.layer.shadowOffset = CGSizeMake(0, 1); 
imageView.layer.shadowOpacity = 1; 
imageView.layer.shadowRadius = 1.0; 
//white border part 
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]]; 
[imageView.layer setBorderWidth: 2.0]; 
+0

Pero en este caso, ¿cómo se puede hacer que la sombra forme parte de la propiedad .image, por ejemplo, guardar o mostrar esa imagen en otro lugar? – alejandrormz

+0

No puedes. No está editando la imagen, la está adornando para mostrarla. Editar realmente los datos del mapa de bits es * mucho * más complicado. Considere simplemente adornar la imagen en cualquier lugar que la muestre, ya que generalmente no desea procesar imágenes para agregar este tipo de efectos, a menos que lo haga en un back-end que los procesa en lotes. – Tim

-2

UIView establece shadowlayer

y addSubview: su imageView

+0

¿Puede profundizar en eso? ¡Gracias! –

4

Swift solution con extensión La subclasificación no es obligatoria. Llame al myImage.addShadow() desde viewDidLoad(). Esto debería funcionar para UIView y UIImageView.

extension UIView { 

    func addShadow() { 
     layer.shadowColor = UIColor.black.cgColor 
     layer.shadowOffset = CGSize(width: 0, height: 0) 
     layer.shadowOpacity = 0.5 
     layer.shadowRadius = 5 
     clipsToBounds = false 
    } 
} 
Cuestiones relacionadas