CALayer – Shadow provoque un coup de performance?

Donc, je fais des animations personnalisées sur mon controller de navigation et la façon dont il pousse et affiche les viewControllers.

Tout fonctionne bien. Dès que j'ajoute le code suivant (dans une sous-class de UINavigationController ), je fais face à un énorme coup de performance. Après avoir ajouté une ombre, toutes les animations deviennent très décalées. Est-ce prévu ou est-ce que je fais quelque chose de mal dans le code?

 // This code gets called once during NavigationController initialization. [self.view setClipsToBounds:NO]; [self.view.layer setCornerRadius:5]; [self.view.layer setShadowOffset:CGSizeMake(0, 20)]; [self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]]; [self.view.layer setShadowRadius:20.0]; [self.view.layer setShadowOpacity:1]; 

MODIFIER:

Changé mon rayon d'ombre à 1 et c'est encore lent

Vous devriez vous attendre à un ralentissement de l'ajout d'une ombre. Un shadowRadius de 20 est très élevé et sera particulièrement lent.

L'autre key pour améliorer la vitesse de rendu d'ombre: définissez la propriété shadowPath . Cela peut aider énormément.

 self.view.layer.shouldRasterize = YES; self.view.layer.rasterizationScale = UIScreen.mainScreen.scale; 

J'ai récemment eu quelques problèmes avec les ombres CALayer lentes, et cette simple ligne de code a tout arrangé pour moi!

Utiliser shadowPath au lieu de shadowOffset .

 theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath; 

Vérifiez ce post: iphone – Les performances d'animation sont très médiocres lorsque l'ombre de la vue est activée

Oui, les ombres sont très chères (en particulier une ombre qui joue gros avec le rayon et vous remarquerez que cela fait une énorme différence dans le degré de ralentissement que vous éprouvez). Une façon d'améliorer les performances consiste à les restituer une fois à un CGImageContext et à afficher cette image au lieu d'avoir à nouveau le rendu de l'ombre chaque fois qu'il est redessiné (mais cela ne fonctionne pas si l'ombre doit animer).