我想设置一个CAShapeLayer
的strokeEnd
属性,但不希望出现默认动画,也不需要任何动画效果。我搜索了一下,但似乎所有的内容都是关于如何动画属性。
我想设置一个CAShapeLayer
的strokeEnd
属性,但不希望出现默认动画,也不需要任何动画效果。我搜索了一下,但似乎所有的内容都是关于如何动画属性。
CAAnimation
符合CAAction
协议。当禁用它们(禁用动画)时,您还会看到术语“操作”被使用。actionForKey:
文档中记录得非常好(下面是摘录)。其中一些在子类化时更相关(您还可以在子类中覆盖actionForKey:
以添加更多新键的隐式操作)。
此方法按以下顺序搜索图层的关联操作:
- 如果该图层具有委托并且该委托实现了访问图层滤镜的方法,则该图层调用该方法。委托必须执行以下操作之一:
- 返回给定键的操作对象。
- 如果它不处理操作,则返回
nil
。- 如果它不处理操作并且搜索应终止,则返回
NSNull
对象。- 图层查看图层的
actions
字典。- 图层在样式字典中查找包含该键的操作字典。
- 图层调用其
defaultActionForKey:
方法以查找任何类定义的操作。- 图层查找由核心动画定义的任何隐式操作。
当您想要禁用动画时,最有趣的两种方法是(它们不同,因为它们用于略微不同的事情):
CATransaction
禁用操作(上面未提到)@"strokeEnd"
键设置[NSNull null]
(上面的第2个数字)使用事务来禁用动画很好,因为您希望在完全禁用多个属性的操作的同时仍然在其他所有位置进行动画。在代码中,它看起来像这样:
[CATransaction begin];
[CATransaction setDisableActions:YES];
// change your property here
yourShapeLayer.strokeEnd = 0.7;
[CATransaction commit]; // animations are disabled until here...
通过修改图层的操作字典,您可以永久更改一个或多个关键帧的默认动画。将[NSNull null]
设置为意味着不应有动画,并且该层应停止在其他地方寻找默认动画。您还可以使用此方法添加可动画属性。通过操作字典删除动画的示例代码如下:
yourShapeLayer.actions = @{@"strokeEnd": [NSNull null]};
yourShapeLayer.strokeEnd = 0.7; // this won't have an animation
NSDictionary *actions = @{@"strokeEnd": [NSNull null]};
yourShapeLayer.actions = actions;
NSDictionary *actions = @{@"strokeEnd": [NSNull null], @"position": [NSNull null], @"position": [NSNull null]};
CABasicAnimation(keyPath: "strokeEnd")
并将持续时间设置为非常小的值。以下是一个示例:let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = someValue
basicAnimation.duration = animated ? 2.0 : 0.01
basicAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
basicAnimation.fillMode = kCAFillModeForwards
basicAnimation.isRemovedOnCompletion = false
// Apply the animation
circleProgress.add(basicAnimation, forKey: "progress")