Ngoài câu trả lời của Brad Larson : đối với các lớp tùy chỉnh (do bạn tạo), bạn có thể sử dụng ủy quyền thay vì sửa đổi lớpactions
từ điển . Cách tiếp cận này năng động hơn và có thể hiệu quả hơn. Và nó cho phép vô hiệu hóa tất cả các hình ảnh động ngầm mà không phải liệt kê tất cả các phím có thể hoạt hình.
Thật không may, không thể sử dụng UIView
s làm đại biểu lớp tùy chỉnh, vì mỗi người UIView
đã là đại biểu của lớp riêng. Nhưng bạn có thể sử dụng một lớp trợ giúp đơn giản như thế này:
@interface MyLayerDelegate : NSObject
@property (nonatomic, assign) BOOL disableImplicitAnimations;
@end
@implementation MyLayerDelegate
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if (self.disableImplicitAnimations)
return (id)[NSNull null]; // disable all implicit animations
else return nil; // allow implicit animations
// you can also test specific key names; for example, to disable bounds animation:
// if ([event isEqualToString:@"bounds"]) return (id)[NSNull null];
}
@end
Cách sử dụng (bên trong khung nhìn):
MyLayerDelegate *delegate = [[MyLayerDelegate alloc] init];
// assign to a strong property, because CALayer's "delegate" property is weak
self.myLayerDelegate = delegate;
self.myLayer = [CALayer layer];
self.myLayer.delegate = delegate;
// ...
self.myLayerDelegate.disableImplicitAnimations = YES;
self.myLayer.position = (CGPoint){.x = 10, .y = 42}; // will not animate
// ...
self.myLayerDelegate.disableImplicitAnimations = NO;
self.myLayer.position = (CGPoint){.x = 0, .y = 0}; // will animate
Đôi khi, thật tiện lợi khi có bộ điều khiển của view làm đại biểu cho các lớp con tùy chỉnh của view; trong trường hợp này không cần lớp trợ giúp, bạn có thể thực hiện actionForLayer:forKey:
phương thức ngay bên trong bộ điều khiển.
Lưu ý quan trọng: đừng cố gắng sửa đổi ủy nhiệm của UIView
lớp bên dưới (ví dụ: để kích hoạt hoạt ảnh ngầm) - điều tồi tệ sẽ xảy ra :)
Lưu ý: nếu bạn muốn tạo hiệu ứng (không vô hiệu hóa hoạt hình cho) vẽ lại lớp, việc đặt [CALayer setNeedsDisplayInRect:]
cuộc gọi vào bên trong là vô ích CATransaction
, bởi vì việc vẽ lại thực tế có thể (và có thể sẽ xảy ra sau đó). Cách tiếp cận tốt là sử dụng các thuộc tính tùy chỉnh, như được mô tả trong câu trả lời này .
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });