आप एक कायर को तुरंत (एनीमेशन के बिना) कैसे स्थानांतरित करेंगे


80

मैं CALayerएक iOS ऐप में खींचने की कोशिश कर रहा हूं ।

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

 layer.position = CGPointMake(x, y)

मैं CALayersतुरंत कैसे आगे बढ़ सकता हूं ? मैं कोर एनीमेशन एपीआई के आसपास अपना सिर पाने के लिए प्रतीत नहीं कर सकता।


: इस अत्यंत पुराने क्यूए के बारे में, महत्वपूर्ण मुद्दा आज यह है stackoverflow.com/a/56980329/294884
fattie

जवाबों:


168

आप निम्नलिखित में अपने कॉल को लपेटना चाहते हैं:

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

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

5
युप, साढ़े 6 साल बाद। फिर भी मददगार। : डी
फोगमिस्टर

1
iOS7 नए शॉर्टहैंड का समर्थन करता है:[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
k06a 12

2
7 साल, 7 महीने और 17 दिन बाद: अभी भी मददगार। धन्यवाद!
kanobius

1
9 साल बाद अंगूठा
लगाओ

32

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

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

उपयोग:

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

1
@noescapeब्लॉक में अनुमति देने के लिए (और इसे स्पष्ट करने के लिए) को जोड़ने के लिए विशेषता को जोड़ना उपयोगी हैself
एंड्रयू

22

आप सुविधा फ़ंक्शन का उपयोग भी कर सकते हैं

[CATransaction setDisableActions:YES] 

भी।

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


5
महत्वपूर्ण, यह प्रभाव सभी CALayer ताकि आप अपने किए जाने के बाद पुन: प्रयोज्य क्रियाओं को करना चाहते हैं, यानी [CATransaction setDableableActions: YES]
योगी शेली

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

15

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

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

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

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

3

स्विफ्ट 4 के लिए यहां पिछले उत्तरों को मिलाकर, स्पष्ट रूप से एनीमेशन की अवधि स्पष्ट करने के लिए ...

extension CALayer
{
    class func perform(withDuration duration: Double, actions: () -> Void) {
        CATransaction.begin()
        CATransaction.setAnimationDuration(duration)
        actions()
        CATransaction.commit()
    }
}

उपयोग ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.