iphone - CALayer: ¿Shadow causa un hit en el rendimiento?
ios uinavigationcontroller (4)
Deberías esperar una desaceleración al agregar una sombra. Un shadowRadius
de 20 es muy alto y será especialmente lento.
La otra clave para mejorar la velocidad de representación de la sombra: establecer la propiedad shadowPath
. Puede ayudar dramáticamente.
Así que estoy haciendo algunas animaciones personalizadas en mi controlador de navegación y la forma en que empuja y hace estallar a los viewControllers.
Todo funciona sin problemas. Tan pronto como agrego el siguiente código (en una subclase de UINavigationController
), me enfrento a un gran impacto en el rendimiento. Después de agregar una sombra, todas las animaciones se vuelven muy retrasadas. ¿Es esto esperado o estoy haciendo algo mal en el código?
// 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];
EDITAR:
Cambié mi radio de sombra a 1 y sigue siendo lento
Sí, las sombras son muy caras (especialmente una sombra tan grande, juega con el radio y notarás que hace una gran diferencia en el grado de desaceleración que experimentas). Una forma de mejorar el rendimiento es representarlo una vez en un CGImageContext
y simplemente mostrar esa imagen en lugar de que la capa vuelva a representar la sombra cada vez que se vuelve a dibujar (pero esto no funciona si la sombra necesita animarse o algo así).
Usando shadowPath
lugar de shadowOffset
.
theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;
Verifique esta publicación: iPhone: el rendimiento de la animación es muy pobre cuando la sombra de la vista está activada
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;
Recientemente tuve algunos problemas con las sombras lentas de CALayer, ¡y esa simple línea de código lo solucionó todo para mí!