我正在尝试在iOS应用中拖动CALayer
。
一旦我更改了它的位置属性,它就会尝试动画到新位置并在整个地方闪烁:
layer.position = CGPointMake(x, y)
如何立即移动CALayers
?我似乎无法理解Core Animation API。
答案 0 :(得分:152)
您想在以下内容中打包:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
答案 1 :(得分:23)
Swift 3扩展:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
用法:
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
答案 2 :(得分:18)
您也可以使用便利功能
[CATransaction setDisableActions:YES]
。
注意:请务必阅读Yogev Shelly的评论,以了解可能发生的任何问题。
答案 3 :(得分:14)
正如其他人所建议的那样,您可以使用CATransaction
问题出现是因为CALayer的默认隐式动画持续时间为0.25秒。
因此,setDisableActions
更容易(我认为)的替代方法是使用值setAnimationDuration
的{{1}}。
0.0
答案 4 :(得分:2)
结合此处先前针对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
}