我正在尝试CALayer
在 iOS 应用程序中拖动 a 。
一旦我改变它的位置属性,它就会尝试动画到新的位置并在整个地方闪烁:
layer.position = CGPointMake(x, y)
我怎样才能CALayers
立即移动?我似乎无法理解 Core Animation API。
我正在尝试CALayer
在 iOS 应用程序中拖动 a 。
一旦我改变它的位置属性,它就会尝试动画到新的位置并在整个地方闪烁:
layer.position = CGPointMake(x, y)
我怎样才能CALayers
立即移动?我似乎无法理解 Core Animation API。
您想将您的电话包装在以下内容中:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Swift 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]
也是。
注意:请务必阅读 Yogev Shelly 的评论,以了解可能出现的任何问题。
正如其他人建议的那样,您可以使用CATransaction
.
出现问题是因为 CALayer 的默认隐式动画持续时间为 0.25 秒。
因此,一个更简单(在我看来)的替代方法setDisableActions
是setAnimationDuration
使用0.0
.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
在此处结合 Swift 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
}