ドラッグしようとしています CALayer
iOSアプリで。
位置プロパティを変更するとすぐに、新しい位置にアニメーション化しようとし、あちこちでちらつきます。
layer.position = CGPointMake(x, y)
どうすればCALayers
すぐに移動できますか?Core AnimationAPIに頭を悩ませているようには見えません。
回答:
通話を次のようにラップします。
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
Swift 3 Extension:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
使用法 :
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
@noescape
ブロックに属性を追加して、ブロックでself
不要なものを許可する(そして明確にする)と便利です
便利機能もご利用いただけます
[CATransaction setDisableActions:YES]
同様に。
注:Yogev Shellyのコメントを読んで、発生する可能性のある落とし穴を理解してください。
他の人が示唆しているように、を使用することができますCATransaction
。
この問題は、CALayerのデフォルトの暗黙的なアニメーション期間が0.25秒であるために発生します。
したがって、(私の意見では)より簡単な代替手段setDisableActions
はsetAnimationDuration
、値をで使用することです0.0
。
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
ここでSwift4の以前の回答を組み合わせて、アニメーションの継続時間を明確にします...
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
}