दिलचस्प पोस्ट
सी # में ऑब्जेक्ट की एक प्रति बनाना अक्षांश के देशांतर में राज्य कोड में अक्षांश निर्देशांक लिनक्स ओओएम किलर द्वारा किस प्रक्रिया को मार डाला गया? पासवर्ड के बिना psql कमांड के साथ बैच फ़ाइल चलाएं असतत एक्स पैमाने का क्रम बदलें jQuery आइफ्रेम लोड () घटना? प्राकृतिक जुड़ने और आंतरिक प्रवेश के बीच अंतर एलआरयू कैश डिज़ाइन क्या जेएलैबल के लिए एक "शब्द लपेटो" संपत्ति है? तिथियों की तुलना करना 'कुंजी' और लैम्ब्डा अभिव्यक्ति का उपयोग करके अजगर अधिकतम फ़ंक्शन स्विफ्ट अर्रे घोषणाओं के बारे में उलझन में आधुनिक पायथन में कस्टम अपवाद घोषित करने का उचित तरीका है? विज़ुअल स्टूडियो 2010 हमेशा सोचता है कि परियोजना पुरानी है, लेकिन कुछ भी नहीं बदला है बीसीएल कलेक्शन स्ट्रेट एन्युमेमेटर का उपयोग क्यों करते हैं, क्लास नहीं?

में अंतर्निहित एनिमेशन को अक्षम करना –

मेरे पास कुछ जटिल आरेखण कोड के साथ इसकी एक परत है- drawInContext: विधि। मैं ड्राइंग की मात्रा को कम करने की कोशिश कर रहा हूं जो मुझे करने की ज़रूरत है, इसलिए मैं -setNeedsDisplayInRect का उपयोग कर रहा हूं: केवल परिवर्तित भागों को अपडेट करने के लिए। यह शानदार ढंग से काम कर रहा है हालांकि, जब ग्राफ़िक्स सिस्टम मेरी परत को अपडेट करता है, तो यह क्रॉस फ़ेड का उपयोग करके पुराने से नए चित्र में परिवर्तित हो रहा है। मैं इसे तुरन्त स्विच करना चाहता हूं

मैंने कार्यों को बंद करने के लिए CATransaction का उपयोग करने की कोशिश की और अवधि को शून्य पर सेट किया, और न ही काम करें यह कोड मैं उपयोग कर रहा हूं:

[CATransaction begin]; [CATransaction setDisableActions: YES]; [self setNeedsDisplayInRect: rect]; [CATransaction commit]; 

क्या कैट्रंसैक्शन पर कोई अलग तरीका है, इसके बजाय मुझे इसका उपयोग करना चाहिए (मैंने भी कोशिश की -सेटवैल्यू: केके: केकेआरएन्सएक्शनडगेबल एक्शन, इसी परिणाम के साथ)

वेब के समाधान से एकत्रित समाधान "में अंतर्निहित एनिमेशन को अक्षम करना –"

आप उचित कुंजी के लिए एनीमेशन के रूप में परत करने के लिए [NSNull null] परत पर क्रिया शब्दकोश सेट करके यह कर सकते हैं। उदाहरण के लिए, मैं उपयोग करता हूँ

 NSDictionary *newActions = @{ @"onOrderIn": [NSNull null], @"onOrderOut": [NSNull null], @"sublayers": [NSNull null], @"contents": [NSNull null], @"bounds": [NSNull null] }; layer.actions = newActions; 

मेरी परतों में से एक के अंदर प्रविष्टिकरण या उपलक्षकों के परिवर्तन पर फीका इन / आउट एनिमेशन को अक्षम करने के साथ-साथ परत के आकार और सामग्री में परिवर्तन भी। मेरा मानना ​​है कि contents कुंजी वह है जिसे आप खोज रहे हैं ताकि क्रॉसफेड ​​को अपडेट किए गए ड्राइंग पर रोक सकें।

इसके अलावा:

 [CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; //foo [CATransaction commit]; 

ब्रैड लार्सन के जवाब के अतिरिक्त: कस्टम परतों (जो आपके द्वारा बनाए गए हैं) के लिए आप परत के 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:] को एक [CALayer setNeedsDisplayInRect:] अंदर कॉल करना बेकार है, क्योंकि वास्तविक [CALayer setNeedsDisplayInRect:] (और संभवत: होगा) कभी-कभी बाद में हो सकता है अच्छा जवाब कस्टम गुणों का उपयोग करना है, जैसा कि इस उत्तर में वर्णित है ।

जब आप किसी परत की संपत्ति बदलते हैं, तो सीए आम तौर पर परिवर्तन को चेतन करने के लिए एक निहित लेनदेन ऑब्जेक्ट बनाता है। यदि आप परिवर्तन को चेतन नहीं करना चाहते हैं, तो आप एक स्पष्ट लेनदेन बनाकर और अपने kCatransactionDisableActions संपत्ति को सही करने के लिए असत्य एनिमेशन को अक्षम कर सकते हैं।

उद्देश्य सी

 [CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; // change properties here without animation [CATransaction commit]; 

तीव्र

 CATransaction.begin() CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions) // change properties here without animation CATransaction.commit() 

सैम के उत्तर के आधार पर, और साइमन की कठिनाइयों … CSShapeLayer बनाने के बाद प्रतिनिधि संदर्भ जोड़ें:

 CAShapeLayer *myLayer = [CAShapeLayer layer]; myLayer.delegate = self; // <- set delegate here, it's magic. 

… कहीं और "मी" फाइल में …

मूल रूप से सैम के कस्टम के रूप में एक ही "कस्टम अक्षम अक्षमअनुमति" चर व्यवस्था के माध्यम से टॉगल करने की क्षमता नहीं है। एक "हार्ड-तार" दृष्टिकोण से अधिक

 - (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event { // disable all implicit animations return (id)[NSNull null]; // allow implicit animations // return nil; // you can also test specific key names; for example, to disable bounds animation: // if ([event isEqualToString:@"bounds"]) return (id)[NSNull null]; } 

दरअसल, मुझे सही जवाब देने के लिए कोई जवाब नहीं मिला मेरे लिए समस्या का हल करने वाली विधि यह थी:

 - (id<CAAction>)actionForKey:(NSString *)event { return nil; } 

फिर आप किसी विशेष एनीमेशन को अक्षम करने के लिए इसमें जो कुछ भी तर्क कर सकते हैं, लेकिन जब से मैं उन सभी को हटाना चाहता था, तब मैं शून्य लौटता था।

स्वीकार्य उत्तर के समान, स्विफ्ट के लिए यहां एक अधिक कुशल समाधान है। कुछ मामलों के लिए हर बार जब आप मूल्य को संशोधित करते हैं, जो कि प्रदर्शन को प्रभावित करते हैं, जैसे कि अन्य लोगों ने उल्लेख किया है, जैसे कि 60 एफपीएस में परत की स्थिति को खींचने के लिए सामान्य उपयोग-मामले।

 // Disable implicit position animation. layer.actions = ["position": NSNull()] 

परत कार्यों को हल करने के लिए सेब के डॉक्स देखें प्रतिनिधि को लागू करने के लिए झरना में एक और स्तर को छोड़ दिया जाएगा लेकिन मेरे मामले में उस प्रतिनिधि के बारे में चेतावनी के कारण बहुत गड़बड़ हो गया था जिसके लिए संबंधित यूआईवीयूवी पर सेट होने की ज़रूरत है ।

संपादित करें: टिप्पणीकर्ता को धन्यवाद देते हुए धन्यवाद कि NSNull अनुरूप है।

इसे अपने कस्टम वर्ग में जोड़ें जहां आप कार्यान्वित कर रहे हैं – ड्रारेक्ट () विधि। अपनी आवश्यकताओं को पूरा करने के लिए कोड में परिवर्तन करें, मेरे लिए 'अस्पष्टता' ने क्रॉस फ़ेड एनीमेशन को रोकने के लिए चाल किया

 -(id<CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)key { NSLog(@"key: %@", key); if([key isEqualToString:@"opacity"]) { return (id<CAAction>)[NSNull null]; } return [super actionForLayer:layer forKey:key]; } 

एक setValue:forKey: भीतर क्रिया को अक्षम करने के लिए एक सरल विधि का पता लगाया गया है जो कि आंतरिक रूप से कॉल setValue:forKey: लिए setValue:forKey: kCATransactionDisableActions कुंजी के लिए:

 [CATransaction setDisableActions:YES]; 

आईओएस 7 के रूप में एक सुविधा पद्धति है जो इस प्रकार करती है:

 [UIView performWithoutAnimation:^{ // apply changes }]; 

CattextLayer की स्ट्रिंग गुण बदलते समय कष्टप्रद (धुँधली) एनीमेशन अक्षम करने के लिए, आप यह कर सकते हैं:

 class CANullAction: CAAction { private static let CA_ANIMATION_CONTENTS = "contents" @objc func runActionForKey(event: String, object anObject: AnyObject, arguments dict: [NSObject : AnyObject]?) { // Do nothing. } } 

और उसके बाद इसका उपयोग करें (अपने कैटेस्टलेयर को ठीक से स्थापित करने के लिए मत भूलें, जैसे कि सही फ़ॉन्ट आदि):

 caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()] 

आप यहां CATextLayer की पूरी सेटअप देख सकते हैं:

 private let systemFont16 = UIFont.systemFontOfSize(16.0) caTextLayer = CATextLayer() caTextLayer.foregroundColor = UIColor.blackColor().CGColor caTextLayer.font = CGFontCreateWithFontName(systemFont16.fontName) caTextLayer.fontSize = systemFont16.pointSize caTextLayer.alignmentMode = kCAAlignmentCenter caTextLayer.drawsAsynchronously = false caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()] caTextLayer.contentsScale = UIScreen.mainScreen().scale caTextLayer.frame = CGRectMake(playbackTimeImage.layer.bounds.origin.x, ((playbackTimeImage.layer.bounds.height - playbackTimeLayer.fontSize) / 2), playbackTimeImage.layer.bounds.width, playbackTimeLayer.fontSize * 1.2) uiImageTarget.layer.addSublayer(caTextLayer) caTextLayer.string = "The text you want to display" 

अब आप जितना चाहें caTextLayer.string अपडेट कर सकते हैं =)

इस से प्रेरित होकर, और यह जवाब।

इसे इस्तेमाल करे।

 let layer = CALayer() layer.delegate = hoo // Same lifecycle UIView instance. 

चेतावनी

यदि आप UITableView इंस्टेंस के प्रतिनिधि को सेट करते हैं, तो कभी-कभी क्रैश हो जाता है। (संभवत: स्क्रॉलव्यूव्स का सबसे पुराना कहा जाता है।)

यदि आपको कभी भी बहुत तेज़ (लेकिन भरोसेमंद हैमी) की ज़रूरत हो तो इसे ठीक से कर सकते हैं (स्विफ्ट):

 let layer = CALayer() // set other properties // ... layer.speed = 999