7

我已经实现了一个 LoadingLayer 类,它有一些动画元素(准确地说是 2 个),这些元素使用CABasicAnimation. 现在,这个加载屏幕视图在整个应用程序中持续存在。隐藏视图会停止所有动画吗?或者让我换个说法:我需要担心很多内存还是可能导致滞后?我尝试使用-pauseLayer:and-resumeLayer:方法,但由于我的应用程序中的多线程,它们导致了一些问题。因此,是否可以隐藏和显示加载屏幕并且其动画一直在运行?

4

4 回答 4

10

https://developer.apple.com/library/content/qa/qa1673/_index.html

-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}
于 2013-04-03T14:40:06.813 回答
4

这是Nico答案的 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
}
于 2017-08-16T02:17:38.103 回答
0

如果视图是隐藏的(不可见或根本不在界面中),则它不是渲染树的一部分。

但是,当嵌入该层的视图控制器离开界面(viewDidDisappear)时,为什么不简单地停止动画呢?只需告诉图层removeAllAnimations。然后重新创建动画,如果需要,在viewWillAppear

于 2013-04-03T14:47:42.223 回答
0

将Nico的修改速度的答案扩展到任何变量:

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 的答案,虽然使用这种方法speed=0.0实际上需要大约11 天才能完成动画,并且在 1 小时内动画将进行大约0.0036

于 2017-11-26T11:46:45.617 回答