CALayerのプロパティは変更すると暗黙的にアニメーションをしてくれます。便利ですね。
でも、シーンによってはこのアニメーションを一時的に無効にしたいケースがあると思います。
####CATransaction.begin と CATransaction.commit
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
//ここにCALayerのプロパティの変更のコードを記述
CATransaction.commit()
上記のように、CATransaction.begin と CATransaction.commit の間に変更されたCALayerのプロパティはアニメーションをしなくなります。が、覚えるのが面倒です!
###iOSは便利だよなぁ、、
UIViewのクラスメソッドにはperformWithoutAnimationというメソッドがあり、アニメーションを無効にしたい一連のプロパティ変更処理をクロージャで渡すことができます
//@available(iOS 7.0, *)
//public class func performWithoutAnimation(actionsWithoutAnimation: () -> Void)
UIView.performWithoutAnimation {
//ここにUIViewのプロパティの変更のコードを記述
}
##OSXにも移植しよう!
extensionを使って、CALayerにもperformWithoutAnimationメソッドを追加してみました
extension CALayer {
class func performWithoutAnimation(actionsWithoutAnimation: () -> Void) {
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
CALayer.performWithoutAnimation {
//ここにCALayerのプロパティの変更のコードを記述
}
わーい、iOSみたいになったよー。