我有一个继承自UIView的子类,其中包含一些CALayer动画,这些动画根据第一次绘制时的当前时间从某个角度开始。问题是,在应用程序从待机状态恢复时,动画将在最后位置继续播放。是否可以检测到这一点,并以某种方式告诉UIView的draw(_:)方法重置所有层和动画,并使用新参数重新绘制所有内容?
您可以在应用程序代理的applicationDidBecomeActive(_:)
方法中调用removeAllAnimations()
来删除所有动画。
(实际上,更好的做法可能是让您的视图控制器注册UIApplicationDidBecomeActive
通知。这样,您就不必担心应用程序代理是否需要通知前端视图控制器删除动画了。)
代码可能如下所示:
NotificationCenter.default.addObserver(self,
selector: #selector(yourSelector(_:)),
name: .UIApplicationDidBecomeActive, object: nil)
如果您没有更改正在进行动画的基础属性,则会删除您的动画并将其图层及其子层恢复到它们动画之前的状态。 (CALayer
动画实际上不会更改它正在动画的图层。它创建了一个“演示图层”来绘制动画,除非您在CAAnimation
上设置了isRemovedOnCompletion=true
,否则演示图层在动画完成后将被移除,图层将恢复到其起始状态。在提交动画之前,将一个图层的属性设置为它的结束状态是很常见的,这样一旦动画完成,底层图层就会保持与动画结束时相同的状态。
如果您已更改正在进行动画的属性/属性,则需要在您的applicationDidBecomeActive(_:)
方法中保存它们的起始状态并重置它们。
removeAllAnimations()
效果很好,谢谢!但是从applicationDidBecomeActive(_:)
中访问我ViewController内部的UIView
的最佳方法是什么? - hoanapplicationDidBecomeActive(_:)
方法,而是让你的视图控制器注册 UIApplicationDidBecomeActive
通知管理器消息。这样更加简洁。 - Duncan CSwift 5
如果您想完全删除图层,并且它是您添加的唯一一个,则此安全的代码片段将完全删除它。
self.layer.removeAllAnimations()
if let myLayer = self.layer.sublayers?.first {
myLayer.removeFromSuperlayer()
}