سؤال

أحاول سحب أ CALayer في تطبيق iOS.

بمجرد أن أقوم بتغيير خاصية موضعها، فإنها تحاول تحريك الموضع الجديد وتومض في كل مكان:

 layer.position = CGPointMake(x, y)

كيف يمكنني التحرك CALayers فورا؟لا يبدو أنني أفهم واجهة برمجة تطبيقات الرسوم المتحركة الأساسية.

هل كانت مفيدة؟

المحلول

وترغب في التفاف المكالمة في ما يلي:

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

نصائح أخرى

ملحق سويفت 3:

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

الاستخدام :

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

ويمكنك أيضا استخدام الدالة الراحة

[CATransaction setDisableActions:YES] 

وكذلك.

ملحوظة: تأكد من قراءة التعليقات التي يوغيف شيلي لفهم أي gotchas التي يمكن أن تحدث

وكما اقترح آخرون، يمكنك استخدام CATransaction.
المشكلة تأتي ينشأ بسبب CALayer لديه مدة الرسوم المتحركة ضمنية الافتراضي 0.25 ثواني.

وهكذا، أسهل (في رأيي) بديل لsetDisableActions هو استخدام setAnimationDuration بقيمة 0.0.

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

والجمع بين الأجوبة السابقة هنا لسويفت 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
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top