2012-11-08 4 views
1

Je peux ajouter une ombre à un calque imageView en utilisant le code suivant.Ajouter une ombre à une couche

self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]]; 
self.imageView.center = self.view.center; 
CALayer *containerLayer= [CALayer layer]; 
containerLayer.shadowColor = [UIColor blackColor].CGColor; 
containerLayer.shadowRadius = 10.0f; 
containerLayer.shadowOffset = CGSizeMake(10.0f, 5.0f); 
containerLayer.shadowOpacity = .8f; 
[containerLayer addSublayer:self.imageView.layer]; 
[self.view.layer addSublayer:containerLayer]; 

1. Le problème est que je ne sais pas pourquoi je dois ajouter imageView.layer à containerLayer pour obtenir l'effet d'ombre imageView. Cependant, si j'ajoute containerLayer à imageView.layer, il n'y a pas d'ombre dans imageView, pourquoi?

Le code d'erreur est:

self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]]; 
self.imageView.center = self.view.center; 
CALayer *containerLayer= [CALayer layer]; 
/*same as before*/ 
[self.imageView.layer addSublayer:containerLayer]; 
[self.view.layer addSublayer:self.imageView.layer]; 

Question2: du containerLayer (utilisé pour fournir l'ombre à imageView) la trame = {{0, 0}, {0, 0}}, mais la position finale est le centre de l'écran. Pourquoi?

enter image description here

Répondre

2

Une couche opaque besoin de quelque chose à l'intérieur pour créer une ombre autour (sauf si vous avez spécifié un Shadowpath explicitement). Donc, votre première version du code fonctionne parce que containerLayer a la couche imageView en sous-couche. Mais, comme vous l'avez remarqué à la question n ° 2, l'image de containerLayer indique qu'elle se trouve réellement dans le coin supérieur gauche avec une taille de (0,0). La raison pour laquelle vous pouvez toujours voir l'image est que containerLayer ne masque pas ses limites. Ajouter cette ligne à votre première version, et l'image disparaît:

[containerLayer setMasksToBounds: YES]; // kitten (and shadow) is gone 

Votre version n ° 2 du code n'affiche pas une ombre parce que, en partie, le containerLayer ne rien « contient ». Si vous utilisez la version 2 mais donnez à containerLayer un nouveau cadre et une couleur d'arrière-plan opaque, une ombre apparaît. (Mais ce n'est évidemment pas une solution, car l'image est cachée ...) Notez également qu'il n'y a pas d'ombre lorsque l'arrière-plan du calque est [UIColor clearColor].

[self.imageView.layer addSublayer:containerLayer]; 
containerLayer.frame = self.imageView.layer.bounds; 
containerLayer.backgroundColor = [UIColor yellowColor].CGColor; // yellow box w/shadow 
// containerLayer.backgroundColor = [UIColor clearColor].CGColor; // no shadow here 

Si vous voulez avoir un conteneur avec une ombre qui abrite le UIImageView, vous pourriez faire quelque chose comme ceci:

UIView * shadowView = [[UIView alloc] initWithFrame: self.imageView.frame]; 
shadowView.layer.shadowColor = [UIColor blackColor].CGColor; 
shadowView.layer.shadowRadius = 10.0f; 
shadowView.layer.shadowOffset = CGSizeMake(10.0f, 5.0f); 
shadowView.layer.shadowOpacity = .8f; 
[self.view addSubview: shadowView]; 
self.imageView.frame = (CGRect) { CGPointZero, self.imageView.frame.size }; 
[shadowView addSubview: self.imageView]; 

A CALayer pourrait être utilisé à la place d'un UIView d'une manière similaire. Vous pouvez également appliquer directement des attributs d'ombre à la couche imageView, en veillant à ce que ni la vue ni le calque ne se limitent aux masques.

-3

Si vous voulez ajouter une ombre sur la imageview juste changer la valeur alpha (0.0 min - 1,0 max) de cette imageview. Cela vous donnera l'effet d'ombre et chaque fois que vous voulez supprimer l'ombre, il suffit de restaurer la valeur alpha à 1.0.

Ex:

self.imageview.alpha = 0.5 // shadow state 
    self.imageview.alpha = 1.0 // original state 
Questions connexes