ब्रैड लार्सन के जवाब के अलावा : कस्टम परतों के लिए (जो आपके द्वारा बनाई गई हैं) आप परत के actions
शब्दकोश को संशोधित करने के बजाय प्रतिनिधिमंडल का उपयोग कर सकते हैं । यह दृष्टिकोण अधिक गतिशील है और अधिक प्रदर्शनकारी हो सकता है। और यह सभी एनिमेटेड कुंजी को सूचीबद्ध किए बिना सभी निहित एनिमेशन को अक्षम करने की अनुमति देता है।
दुर्भाग्य से, UIView
कस्टम परत प्रतिनिधियों के रूप में एस का उपयोग करना असंभव है , क्योंकि प्रत्येक UIView
पहले से ही अपनी परत का प्रतिनिधि है। लेकिन आप इस तरह से एक साधारण सहायक वर्ग का उपयोग कर सकते हैं:
@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
उपयोग (दृश्य के अंदर):
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
कभी-कभी दृश्य के कस्टम सबलेयर्स के प्रतिनिधि के रूप में दृश्य नियंत्रक होना सुविधाजनक होता है; इस मामले में सहायक वर्ग की कोई आवश्यकता नहीं है, आप actionForLayer:forKey:
कंट्रोलर के अंदर विधि को लागू कर सकते हैं ।
महत्वपूर्ण नोट: के UIView
अंतर्निहित परत के प्रतिनिधि को संशोधित करने की कोशिश न करें (उदाहरणार्थ एनिमेशन को सक्षम करने के लिए) - बुरी चीजें होंगी :)
नोट: यदि आप लेयर रीड्र्स को एनिमेट करना चाहते हैं (ऐनिमेट नहीं करना चाहते हैं), तो [CALayer setNeedsDisplayInRect:]
ए के अंदर कॉल डालना बेकार है CATransaction
, क्योंकि वास्तविक रिडरिंग कभी-कभी हो सकती है। अच्छा दृष्टिकोण कस्टम गुणों का उपयोग करना है, जैसा कि इस उत्तर में वर्णित है ।
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });