Tôi gặp sự cố tương tự khi xoay quanh trục z. Thiết lập shouldRasterize = YES ngăn chặn các cạnh bị lởm chởm tuy nhiên nó có chi phí hiệu năng. Trong trường hợp của tôi, tôi đã sử dụng lại các khung nhìn (và các lớp của nó) và giữ cho shouldRasterize = YES làm chậm mọi thứ.
Giải pháp là tắt tính năng rasterization ngay sau khi tôi không cần nữa. Tuy nhiên, kể từ khi hình ảnh động chạy trên một chủ đề khác, không có cách nào để biết khi nào hoạt hình hoàn tất ... cho đến khi tôi tìm ra một phương pháp CATransaction cực kỳ hữu ích. Đây là một mã thực tế mà tôi đã sử dụng và nó nên minh họa cho việc sử dụng nó:
// 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"];
làm việc như một sự quyến rũ đối với tôi.
Tôi chưa thử sử dụng điều này với hoạt ảnh ngầm định (tức là hoạt ảnh xảy ra do thay đổi giá trị trong thuộc tính có thể hoạt hình cho lớp không được xem), tuy nhiên tôi mong đợi nó hoạt động miễn là phương thức CATransaction được gọi trước thay đổi thuộc tính, cũng giống như một sự đảm bảo rằng block được gán cho CATransaction trước khi một hình động bắt đầu.
Bạn có thể muốn thêm 'view.layer.rasterizationScale = [[UIScreen mainScreen] scale];' để tránh bị mờ trên màn hình Retina. –
Nhận xét này phải là một phần của câu trả lời. Đặt thuộc tính 'shouldRasterize' là không đủ! –
Bạn nói đúng. Làm xong. – tarmes