ব্র্যাড লারসনের উত্তর ছাড়াও : কাস্টম স্তরগুলির জন্য (যা আপনার দ্বারা তৈরি করা হয়েছে) আপনি স্তরটির actions
অভিধান সংশোধন না করে প্রতিনিধি ব্যবহার করতে পারেন । এই পদ্ধতির আরও গতিশীল এবং আরও অভিনয় হতে পারে। এবং এটি সমস্ত অ্যানিমেটেবল কীগুলি তালিকাভুক্ত না করে সমস্ত অন্তর্নিহিত অ্যানিমেশনগুলি অক্ষম করার অনুমতি দেয়।
দুর্ভাগ্যক্রমে, UIView
কাস্টম লেয়ার প্রতিনিধি হিসাবে এটি ব্যবহার করা অসম্ভব , কারণ প্রত্যেকে UIView
ইতিমধ্যে নিজস্ব স্তরের প্রতিনিধি is তবে আপনি এটির মতো একটি সাধারণ সহায়ক শ্রেণি ব্যবহার করতে পারেন:
@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(), ^{ });