86 votes

Pourquoi masksToBounds = OUI empêche CALayer de l'ombre?

Avec l'extrait suivant, je vais ajouter un effet d'ombre portée sur l'un de mes UIView. Qui fonctionne plutôt bien. Mais dès que j'ai mis de la vue masksToBounds propriété de OUI. L'effet d'ombre portée n'est pas rendu.

self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;

Avez-vous des idées à ce sujet?

171voto

TheSquad Points 2274

Parce que l'ombre est un effet fait hors de la Vue, et que masksToBounds défini à OUI, diront les UIView de ne pas tirer de tout ce qui est en dehors de lui-même.

Si vous voulez un roundedCorner vue avec de l'ombre, je vous suggère de le faire avec 2 points de vue:

UIView *view1 = [[UIView alloc] init];
UIView *view2 = [[UIView alloc] init];

view1.layer.cornerRadius = 5.0;
view1.layer.masksToBounds = YES;
view2.layer.cornerRadius = 5.0;
view2.layer.shadowColor = [[UIColor blackColor] CGColor];
view2.layer.shadowOpacity = 1.0;
view2.layer.shadowRadius = 10.0;
view2.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
[view2 addSubview:view1];
[view1 release];

18voto

Philip007 Points 940

C'est iOS 6, maintenant, les choses ont peut être changé. TheSquad la réponse n'a pas fonctionné pour moi jusqu'à ce que j'ai réussi à ajouter une ligne view2.layer.masksToBounds = NO;, sinon l'ombre ne montre pas. Bien que la documentation, dit - masksToBounds est PAS par défaut, mon code montre le contraire.

Voici comment je fais un angle arrondi bouton avec de l'ombre, qui est parmi les plus couramment utilisés extrait de code dans mon application.

button.layer.masksToBounds = YES;
button.layer.cornerRadius = 10.0f;

view.layer.masksToBounds = NO;      // critical to add this line
view.layer.cornerRadius = 10.0f;
view.layer.shadowOpacity = 1.0f;
// set shadow path to prevent horrible performance
view.layer.shadowPath = 
    [UIBezierPath bezierPathWithRoundedRect:_button.bounds cornerRadius:10.0f].CGPath;      

[view addSubview:button];

MODIFIER

Si les points de vue doivent être animés ou décalés, masksToBounds = YES de l'impôt les performances de façon significative, ce qui signifie que l'animation sera probablement obtenir bégaya. Pour obtenir des coins arrondis et de l'ombre ET de la douceur de l'animation ou de défilement, utilisez le code suivant à la place:

button.backgroundColor = [UIColor clearColor];
button.layer.backgroundColor = [UIColor redColor].CGColor;
button.layer.masksToBounds = NO;
button.layer.cornerRadius = 10.0f;

view.layer.shadowOpacity = 0.5f;
view.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:_button.bounds cornerRadius:10.0f].CGPath;
view.layer.shadowOffset = CGSizeMake(0.0f, 4.0f);
view.layer.shadowRadius = 2.0f;
view.layer.masksToBounds = NO;
view.layer.cornerRadius = 10.0f;  

[view addSubview:button];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X