Ios 暂停并恢复加载屏幕的CABASICANIATION?

Ios 暂停并恢复加载屏幕的CABASICANIATION?,ios,objective-c,cabasicanimation,Ios,Objective C,Cabasicanimation,我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些元素是用CABasicAnimation设置动画的。现在,这个加载屏幕视图贯穿整个应用程序。隐藏视图是否会停止所有动画?或者让我换一种说法:我是否有很多内存需要担心,或者这可能会导致延迟?我尝试使用-pauseLayer:和-resumeLayer:方法,但由于应用程序中的多线程,它们导致了一些问题。因此,隐藏和显示加载屏幕并始终运行其动画是否可以 如果视图是隐藏的(不可见或根本不在界面中),则它不是渲染树的一

我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些元素是用
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
    }
}