Ios 暂停并恢复加载屏幕的CABASICANIATION?
我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些元素是用Ios 暂停并恢复加载屏幕的CABASICANIATION?,ios,objective-c,cabasicanimation,Ios,Objective C,Cabasicanimation,我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些元素是用CABasicAnimation设置动画的。现在,这个加载屏幕视图贯穿整个应用程序。隐藏视图是否会停止所有动画?或者让我换一种说法:我是否有很多内存需要担心,或者这可能会导致延迟?我尝试使用-pauseLayer:和-resumeLayer:方法,但由于应用程序中的多线程,它们导致了一些问题。因此,隐藏和显示加载屏幕并始终运行其动画是否可以 如果视图是隐藏的(不可见或根本不在界面中),则它不是渲染树的一
CABasicAnimation
设置动画的。现在,这个加载屏幕视图贯穿整个应用程序。隐藏视图是否会停止所有动画?或者让我换一种说法:我是否有很多内存需要担心,或者这可能会导致延迟?我尝试使用-pauseLayer:
和-resumeLayer:
方法,但由于应用程序中的多线程,它们导致了一些问题。因此,隐藏和显示加载屏幕并始终运行其动画是否可以
如果视图是隐藏的(不可见或根本不在界面中),则它不是渲染树的一部分
但是,当嵌入该层的视图的视图控制器离开界面时(
viewdiddemove
),为什么不简单地停止动画呢?只需告诉图层移除警报
。然后重新创建动画,如果需要,在视图中将出现?以下是swift 3版本的答案
希望有帮助
fileprivate func pauseLayer(layer: CALayer) {
let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
fileprivate func resumeLayer(layer: CALayer) {
let pausedTime = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
layer.beginTime = timeSincePause
}
扩展将速度修改为任何变量的答案:
extension CALayer {
func udpate(speed newSpeed: Float) {
let newSpeed = newSpeed == 0 ? 1e-6 : newSpeed
let triggerTime = self.convertTime(CACurrentMediaTime(), from: nil)
let offset = self.timeOffset
let begin = self.beginTime
let speed = self.speed
self.beginTime = (triggerTime - offset) / Double(speed) + begin
self.timeOffset = triggerTime
self.speed = newSpeed
}
}
如果您愿意以交互方式更改层动画速度,请使用此方法。如果你想完全停止该层,你应该使用Nico的答案,尽管使用速度=0.0
的这种方法实际上需要11天才能完成动画,并且在1小时内动画将进展约0.0036
我有一个非常类似的实现,但你的实现很有效,谢谢!好的,不,实际上我有完全相同的实现。但现在我知道为什么它有时会停止工作。每当应用程序进入后台,我重新启动它,动画就不会再次恢复。你知道是什么原因造成的吗?试着清除动画并在DidbeomCeActivity上读取它们。我认为这些动画可能会因为ARC而被清除。但是,只要调用-view:
时,我就会重新添加它们,并在调用-view:
时清除它们。
extension CALayer {
func udpate(speed newSpeed: Float) {
let newSpeed = newSpeed == 0 ? 1e-6 : newSpeed
let triggerTime = self.convertTime(CACurrentMediaTime(), from: nil)
let offset = self.timeOffset
let begin = self.beginTime
let speed = self.speed
self.beginTime = (triggerTime - offset) / Double(speed) + begin
self.timeOffset = triggerTime
self.speed = newSpeed
}
}