У меня была похожая проблема при вращении вокруг оси z.Установка shouldRasterize = YES предотвратила зазубренные края, однако это привело к снижению производительности.В моем случае я повторно использовал представления (и их слои), и поддержание shouldRasterize = YES замедляло процесс.
Решение было в том, чтобы отключить растеризацию сразу после того, как она мне больше не нужна.Однако, поскольку анимация выполняется в другом потоке, не было никакого способа узнать, когда анимация была завершена ... пока я не узнал об очень полезном методе CATransaction.Это фактический код, который я использовал, и он должен иллюстрировать его использование:
// 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"];
работал для меня как оберег.
Я не пробовал использовать это с неявными анимациями (т.е. анимациями, которыепроисходит из-за изменения значения в свойстве animatable для связанного слоя, не являющегося видом), однако я ожидаю, что он будет работать до тех пор, пока метод CATransaction вызывается до изменения свойства, просто как гарантия, что блок передается в CATransaction перед анимациейначинается.