我正在尝试CALayer
在iOS应用中拖动。
一旦更改其position属性,它就会尝试动画到新位置并在整个位置闪烁:
layer.position = CGPointMake(x, y)
如何CALayers
立即移动?我似乎无法理解Core Animation API。
Answers:
您要将呼叫包装在以下内容中:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
Swift 3扩展名:
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];
在这里结合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
}