2012-04-18 13 views
8

He estado probando todos y cada uno de los métodos que he encontrado pero no he podido. Simplemente quiero hacer una etiqueta con esquinas redondeadas, una sombra paralela con un patrón de fondo. La sombra solo funciona si no quiero esquinas redondeadas. ¡No puedo juntarlos a los dos!UILabel con esquinas redondeadas, sombra paralela y patrón de fondo

Aquí está mi código con la sombra:

label.text = msg; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(20,10,280,40); 
label.backgroundColor 
    = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"msg_box_bg.png"]]; 

[label.layer setCornerRadius:10]; 
[label.layer setMasksToBounds:NO]; 

/* Shadow */ 
label.layer.shadowColor = [UIColor blackColor].CGColor; 
label.layer.shadowOpacity = 0.6; 
label.layer.shadowOffset = CGSizeMake(0,0); 
label.layer.shadowRadius = 3; 

Esto me da sombra sin esquinas redondeadas. Pero si uso

[label.layer setMasksToBounds:YES]; 

Esto me dará esquinas redondeadas sin sombras. Me he tomado el consejo para utilizar una ruta de sombra, por lo que el código con el camino de la sombra se ve así:

label.text = msg; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(20,10,280,40); 
label.backgroundColor 
    = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"msg_box_bg.png"]]; 

[label.layer setCornerRadius:10]; 
[label.layer setMasksToBounds:YES]; 

/* Shadow */ 
label.layer.shadowColor = [UIColor blackColor].CGColor; 
label.layer.shadowOpacity = 0.6; 
label.layer.shadowOffset = CGSizeMake(0,0); 
label.layer.shadowRadius = 3; 
label.layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:label.frame cornerRadius:10]CGPath]; 
label.layer.shouldRasterize = YES; 

Este código hace dame esquinas redondeadas pero ninguna sombra. ¿Alguna sugerencia?

Gracias!

+0

http://stackoverflow.com/questions/3690972/why-maskstobounds-yes-prevents-calayer-shadow –

Respuesta

11

enter image description here

que utiliza el código siguiente para obtener los resultados que buscábamos.

CGSize size = CGSizeMake(280, 40); 

/** Shadow */ 
CALayer *shadowLayer = [CALayer new]; 
shadowLayer.frame = CGRectMake(20,100,size.width,size.height); 
shadowLayer.cornerRadius = 10; 

shadowLayer.backgroundColor = [UIColor clearColor].CGColor; 
shadowLayer.shadowColor = [UIColor blackColor].CGColor; 
shadowLayer.shadowOpacity = 0.6; 
shadowLayer.shadowOffset = CGSizeMake(0,0); 
shadowLayer.shadowRadius = 3; 

/** Label */ 
UILabel *label = [UILabel new]; 
label.text = @"Hello World"; 
label.textAlignment = UITextAlignmentCenter; 
label.frame = CGRectMake(0, 0, size.width, size.height); 
label.backgroundColor = [UIColor clearColor]; 
label.layer.cornerRadius = 10; 
[label.layer setMasksToBounds:YES]; 
// customLabel.backgroundColor = [UIColor whiteColor]; 
label.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"options.png"]]; 

/** Add the Label to the shawdow layer */ 
[shadowLayer addSublayer:label.layer]; 

[self.view.layer addSublayer:shadowLayer];  

[shadowLayer release]; 
+0

Esto es correcto. El problema es que una capa con una imagen de patrón no respetará el radio de una esquina a menos que se enmascare en los límites, y no se dibujará una sombra si _do_ mask a los límites. Por lo tanto, se requieren capas separadas para la sombra. – jrturton

+0

Veo el pont. Pero, lamentablemente, el código no muestra nada para mí. Copié el código como está con el archivo de fondo llamado "options.png" que no tengo, mostró una caja negra. Cuando pongo mi nombre de archivo de fondo, no se muestra nada. ¡Estoy realmente confundido por esto! Trataré de jugar con él para ver qué puedo hacer. – hsnm

+0

Lo que @jrturton dijo es correcto, esto es lo que hice con el código. De acuerdo con su no ver nada. Vamos a depurar los resultados: intente esto, comente el label.backgroundColor = [[UIColor alloc] initWithPatternImage: [UIImage imageNamed: @ "options.png"]]; línea. Quite la marca de la línea anterior y cambie el nombre de la etiqueta customLabel a label. Ahora debería ver una etiqueta blanca redondeada con una sombra negra. ¿Están obteniendo ese resultado? – haroldcampbell

Cuestiones relacionadas