كيف يمكنك نقل CALayer على الفور (بدون رسوم متحركة)
-
03-07-2019 - |
سؤال
أحاول سحب أ 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
}