重置 CALayer 绘图/动画

Reset CALayer drawings / animations

我在 UIView 的子类中有一些 CALayer 动画,它们在第一次绘制时根据当前时间以特定角度开始。问题是,当应用程序从待机状态恢复时,动画只会在最后一个位置恢复。是否有可能检测到这一点并以某种方式告诉 UIView 的 draw(_:) 方法重置所有图层和动画并使用新参数再次绘制所有内容?

您可以使用removeAllAnimations()

here is the link

您当然可以在您的应用委托 applicationDidBecomeActive(_:) 方法中调用层上的 removeAllAnimations() 来删除所有动画。

(实际上,让您的视图控制器注册 UIApplicationDidBecomeActive 通知可能更干净。这样您就不必为让您的应用程序委托担心通知前视图控制器它应该删除动画而苦恼.)

该代码可能如下所示:

NotificationCenter.default.addObserver(self, 
  selector: #selector(yourSelector(_:)), 
  name: .UIApplicationDidBecomeActive, object: nil)

如果您没有更改正在设置动画的底层 属性,那么这将删除您的动画并将您的图层及其子图层恢复到它们的 pre-animation 状态。 (CALayer 动画实际上并没有改变它的动画图层。它创建了一个 "presentation layer" 来绘制动画,除非你在你的 CAAnimation 上设置了 isRemovedOnCompletion=true,演示文稿动画完成后图层将被删除,图层恢复到它的开始状态。在提交动画之前将图层的 属性 设置为其结束状态是很常见的,这样一旦动画完成,底层就会留在与动画结束时的状态相同。)

如果您已经更改了您正在制作动画的property/properties,那么您将需要保存它们的起始状态并在您的[=12=中将它们重置为该状态]方法。

Swift 5

如果您想要完全删除图层,并且它是您添加的唯一图层,那么这段安全的小代码会将其完全删除。

self.layer.removeAllAnimations()
if let myLayer = self.layer.sublayers?.first {        
    myLayer.removeFromSuperlayer()
}