Tuve un problema similar al girar alrededor del eje z. El ajuste shouldRasterize = YES evitó los bordes irregulares, sin embargo, tuvo un costo de rendimiento. En mi caso, estaba reutilizando los puntos de vista (y sus capas) y manteniendo el orden shouldRasterize = YES estaba ralentizando las cosas.
La solución fue apagar la rasterización inmediatamente después de que ya no la necesité. Sin embargo, dado que la animación se ejecuta en otro hilo, no había forma de saber cuándo se completó la animación ... hasta que descubrí un método de CATransaction extremadamente útil. Este es un código real que utilicé y debe ilustrar su uso:
// Create a key frame animation
CAKeyframeAnimation *wiggle = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
NSInteger frequency = 5; // Higher value for faster vibration
NSInteger amplitude = 25; // Higher value for lower amplitude
// Create the values it will pass through
NSMutableArray *valuesArray = [[NSMutableArray alloc] init];
NSInteger direction = 1;
[valuesArray addObject:@0.0];
for (NSInteger i = frequency; i > 0; i--, direction *= -1) {
[valuesArray addObject:@((direction * M_PI_4 * (CGFloat)i/(CGFloat)amplitude))];
}
[valuesArray addObject:@0.0];
[wiggle setValues:valuesArray];
// Set the duration
[wiggle setAdditive:YES];
[wiggle setValueFunction:[CAValueFunction functionWithName:kCAValueFunctionRotateZ]];
[wiggle setDuration:0.6];
// Turn on rasterization to prevent jagged edges (anti-aliasing issues)
viewToRotate.layer.shouldRasterize = YES;
// ************ Important step **************
// Very usefull method. Block returns after ALL animations have completed.
[CATransaction setCompletionBlock:^{
viewToRotate.layer.shouldRasterize = NO;
}];
// Animate the layer
[viewToRotate.layer addAnimation:wiggle forKey:@"wiggleAnimation"];
funcionó como un encanto para mí.
No he intentado usar esto con animaciones implícitas (es decir, animaciones que ocurren debido al cambio de valor en la propiedad animable para una capa asociada no visible), sin embargo, esperaría que funcionara siempre que se llame al método CATransaction el cambio de propiedad, solo como una garantía, el bloque se le da a CATransaction antes de que comience una animación.
Es posible que desee añadir 'view.layer.rasterizationScale = [[UIScreen mainScreen] escala];' para evitar borrosa en las pantallas Retina. –
Este comentario debería ser parte de la respuesta. Establecer la propiedad 'shouldRasterize' no es suficiente! –
Tienes razón. Hecho. – tarmes