2012-04-18 11 views
8

Ho provato ogni singolo metodo trovato ma non sono riuscito a farlo. Voglio semplicemente creare un'etichetta con angoli arrotondati, un'ombra esterna con un motivo di sfondo. L'ombra funziona solo se non voglio angoli arrotondati. Non riesco a prenderli entrambi insieme!Un UILabel con angoli arrotondati, ombra esterna e motivo di sfondo

Ecco il mio codice con l'ombra:

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; 

Questo mi dà ombra angoli arrotondati. Ma se io uso

[label.layer setMasksToBounds:YES]; 

Questo mi darà angoli arrotondati senza ombra. Ho preso i consigli di utilizzare un percorso di ombra, in modo che il codice con il percorso ombra appare così:

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; 

Questo codice dà me gli angoli arrotondati, ma nessuna ombra. Qualche suggerimento?

Grazie!

+0

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

risposta

11

enter image description here

ho usato il codice qui sotto per ottenere i risultati che cercavamo.

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

Questo è corretto. Il problema è che un livello riempito con un'immagine di modello non rispetterà un raggio d'angolo a meno che non si mascherino ai limiti e un'ombra non verrà disegnata se si maschera _do_ sui limiti. Quindi è necessario un layer separato per l'ombra. – jrturton

+0

Vedo il pont. Ma sfortunatamente il codice non mostra niente per me. Ho copiato il codice così com'è con il file di sfondo chiamato "options.png" che non ho, ha mostrato una scatola nera. Quando inserisco il nome del mio file di sfondo, non mostra nulla che sia mai stato così. Sono davvero confuso da questo! Proverò a giocarci per vedere cosa posso fare. – hsnm

+0

Ciò che @jrturton ha detto è corretto, questo è quello che ho fatto con il codice. Secondo il tuo non vedere nulla. Effettuiamo il debug dei risultati: prova questo, commenta label.backgroundColor = [[UIColor alloc] initWithPatternImage: [UIImage imageNamed: @ "options.png"]]; linea. Rimuovi il commento dalla riga sopra e rinomina la variabile customLabel da etichettare. Ora dovresti vedere un'etichetta bianca arrotondata con un'ombra nera. Stai ottenendo quel risultato? – haroldcampbell