2008-10-22 19 views
58

मैं एक आईओएस ऐप में एक कैलियर खींचने की कोशिश कर रहा हूं।आप तुरंत कैलियर को कैसे ले जाते हैं (एनीमेशन के बिना)

जैसे ही मैं अपनी स्थिति संपत्ति को बदलने के रूप में यह नई स्थिति में चेतन की कोशिश करता है और हर जगह flickers:

layer.position = CGPointMake(x, y) 

मैं कैसे CALayers तुरंत स्थानांतरित कर सकते हैं? मुझे कोर एनीमेशन एपीआई के आसपास अपना सिर नहीं मिल रहा है।

उत्तर

131

आप निम्न में अपने कॉल रैप करने के लिए करना चाहते हैं:

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+1

वास्तव में यह है कि। मैंने कैटर्रैक्शन के बारे में भी सोचा नहीं था। आपका बहुत बहुत धन्यवाद! – Mel

+3

2 साल बाद, धन्यवाद, लॉल। – nacho4d

+3

5 साल बाद, धन्यवाद! – MichaelScaria

17

तुम भी सुविधा समारोह

[CATransaction setDisableActions:YES] 

रूप में अच्छी तरह उपयोग कर सकते हैं।

नोट: योगेव शेली द्वारा टिप्पणियों को पढ़ने के लिए सुनिश्चित करें कि किसी भी गठिया को समझने के लिए।

+4

महत्वपूर्ण, यह सभी कैलियर को प्रभावित करता है ताकि आप पूरा होने के बाद क्रियाओं को पुन: सक्षम कर सकें, यानी [कैट्रानैक्शन सेट डिस्प्लेएक्शन: हाँ] –

+0

अरे मुझे यह कहना चाहिए था। शानदार प्रदर्शन। कमांड एनीमेशन को तब तक अक्षम करता है जब तक कि यह कोर पर नहीं चलता है या जब तक कि कोर ग्राफिक्स एनीमेशन इंजन ने एक रन चक्र पूरा नहीं किया हो। सुनिश्चित नहीं है कि इसके लिए यह सही शब्द है:/लेकिन सभी के लिए इसे साफ़ करने के लिए धन्यवाद। – Biclops

12

जैसा कि अन्य ने सुझाव दिया है, आप CATransaction का उपयोग कर सकते हैं।
समस्या उत्पन्न होती है क्योंकि कैलायर की 0.25 सेकेंड की डिफ़ॉल्ट अंतर्निहित एनीमेशन अवधि होती है।

इस प्रकार, setDisableActions के विकल्प के लिए एक आसान (मेरी राय में) setAnimationDuration का उपयोग 0.0 के मान के साथ करना है।

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.0]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+0

याद रखना आसान है, जब आप कोड को फिर से पढ़ रहे हों, और टाइप करना आसान हो, तो समझने में आसान। धन्यवाद! –

10

स्विफ्ट 3 एक्सटेंशन:

extension CALayer { 
    class func performWithoutAnimation(_ actionsWithoutAnimation:() -> Void){ 
     CATransaction.begin() 
     CATransaction.setValue(true, forKey: kCATransactionDisableActions) 
     actionsWithoutAnimation() 
     CATransaction.commit() 
    } 
} 

उपयोग:

CALayer.performWithoutAnimation(){ 
    someLayer.position = newPosition 
} 
+0

ब्लॉक में '@ नोस्केप' विशेषता जोड़ने के लिए उपयोगी है (और इसे स्पष्ट करें) कि ब्लॉक में 'self' की आवश्यकता नहीं है – Andrew