2012-02-09 14 views
11

Vorrei creare un'ombra interna sul mio UIView su iPad così:Creare ombra interna in UIView

UIView with shadow

Questo UIView potrebbe cambiare dimensioni, quindi non posso usare un'immagine semplice per creare questo tipo di ombra.

Ho provato con setShadow ecc., Ma è solo un dropshadow che viene creato.

Qualche idea su come creare questo tipo di ombra?

risposta

6

Creare l'ombra come strato trasparente ad una determinata dimensione, quindi creare un'immagine estensibile, in questo modo:

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

si può quindi mettere che come immagine in un'UIImageView con scala contentMode per adattarsi e funzionerà nel modo desiderato

Diciamo che la vista è chiamata "myView". È possibile aggiungere l'ombra in questo modo:

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 

È anche possibile fare la maggior parte di questo costruttore di interfaccia, se si preferisce, a patto che si crea l'immagine in sé estensibile in codice.

+0

mi metterà alla prova adesso. – alexmngn

+0

Come posso fare per aggiungere questa immagine stretch sullo sfondo del mio UIView? Con il metodo 'backgroundColor' questo non funziona. – alexmngn

+0

Hai visto la seconda parte della mia risposta sull'utilizzo di UIImageView e l'ho aggiunto come sottoview alla tua vista principale? –

1

La domanda è stata già parzialmente risolta in 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; 

Giocare con le variabili fino a quando non soddisfare il vostro stile di ombra.

UPDATE

invece si può disegnare un ombra esterna su una visione più piccola centrato che si trova sulla parte superiore del vostro vista esistente.

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

È un ottimo modo per disegnare un'ombra * outer * - ma non sono sicuro di quanto sia facile adattarlo per disegnare un'ombra * inner *. –

+0

Posizionando una vista più piccola chiara sopra la vista esistente e disegnando un'ombra esterna nella sottoview più piccola e trasparente. Finché la vista più piccola è centrata dovresti stare bene. –

+3

Non funzionerà, l'ombra si dissolverebbe verso l'esterno verso il bordo invece di diventare più scura. Inoltre, non penso che le viste trasparenti possano gettare ombre. –