2012-02-09 8 views
11

me gustaría crear una sombra interior en mi UIView en el iPad así:Crear sombra interior en UIView

UIView with shadow

Este UIView podría cambiar el tamaño así que no puedo utilizar una imagen simple de crear este tipo de la sombra

He probado con setShadow etc., pero solo se crea una sombra de gotas.

¿Alguna idea de cómo crear este tipo de sombra?

Respuesta

6

Crear la sombra como una capa transparente en un tamaño determinado, a continuación, crear una imagen estirable, como esto:

UIImage *shadowImage = [UIImage imageNamed:@"shadow.png"]; 
shadowImage = [shadowImage stretchableImageWithLeftCapWidth:floorf(shadowImage.size.width/2) topCapHeight:floorf(shadowImage.size.height/2)]; 

entonces usted puede poner que a medida que la imagen en un UIImageView con la escala contentMode a la medida y se funcionará de la manera que desee.

Digamos que su vista se llama "myView". Puede añadir la sombra de esta manera:

UIImageView *shadowImageView = [[UIImageView alloc] initWithImage:shadowImage]; 
shadowImageView.contentMode = UIViewContentModeScaleToFill; 
shadowImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
shadowImageView.frame = myView.bounds; 
[myView addSubview:shadowImageView]; 
[shadowImageView release]; // only needed if you aren't using ARC 

También se puede hacer la mayor parte de esto en constructor de interfaces, si lo prefiere, siempre y cuando se crea la propia imagen estirable en el código.

+0

Voy a probar eso ahora. – alexmngn

+0

¿Cómo puedo hacer para agregar esta imagen elástica en el fondo de mi UIView? Con el método 'backgroundColor' esto no funciona. – alexmngn

+0

¿Vió la segunda parte de mi respuesta sobre el uso de un UIImageView y lo agregó como una subvista a su vista principal? –

1

Esta pregunta ya fue respondida parcialmente en SO

view.layer.masksToBounds = NO; 
view.layer.cornerRadius = 8; // if you like rounded corners 
view.layer.shadowRadius = 5; 
view.layer.shadowOpacity = 0.5; 
CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:innerRect].CGPath; 

Juega un poco con las variables hasta que se adapten a su estilo de sombra.

ACTUALIZACIÓN

su lugar se puede dibujar una sombra exterior en una visión centrada más pequeño que se encuentra en la parte superior de la vista existente.

CGFloat indent = 10; 
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent); 
UIView * shadowView = [[UIView alloc] initWithFrame:innerRect]; 
shadowView.backgroundColor = [UIColor clearColor]; 
shadowView.layer.masksToBounds = NO; 
shadowView.layer.cornerRadius = 8; // if you like rounded corners 
shadowView.layer.shadowRadius = 5; 
shadowView.layer.shadowOpacity = 0.5; 
shadowView.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowView.bounds].CGPath; 
[view addSubview:shadowView]; 
[shadowView release]; 
+0

Esa es una gran manera de dibujar una * sombra * externa, pero no estoy seguro de lo fácil que es adaptar eso para dibujar una * sombra * interna. –

+0

Al colocar una vista más clara en la parte superior de su vista existente, y dibujando una sombra exterior en la subvista clara más pequeña. Siempre que la vista más pequeña esté centrada, debería estar bien. –

+3

Eso no funcionará, la sombra se desvanecería hacia el borde en lugar de oscurecerse. Además, no creo que las vistas transparentes puedan proyectar sombras. –

Cuestiones relacionadas