2013-04-03 98 views
6

我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些动画元素用CABasicAnimation动画。现在,这个加载屏幕视图在整个应用程序中持续存在。隐藏视图是否会停止所有动画?或者让我重述一下:是否有很多记忆我不得不担心或可能导致滞后?我尝试使用-pauseLayer:-resumeLayer:方法,但是由于在我的应用程序中使用了多线程,它们导致了一些问题。因此,只需隐藏并显示其动画一直运行的加载屏幕即可?暂停并恢复CABasicAnimation的加载屏幕?

回答

9

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; 
} 
+0

我有一个非常相似实施但你的作品,谢谢! –

+0

好的,不,实际上我有完全相同的实现。但现在我知道它为什么不时停止工作。每当应用程序进入后台并重新启动时,动画将不会再次恢复。任何想法可能会造成这种情况? –

+1

尝试清除动画并在didBeomceActive上读取它们 – Nico

0

如果视图是隐藏的(不可见或没有在接口的话),则它是不呈现树的一部分。

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

2

这里是Nico's答案的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 
} 
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 
    } 
} 

使用这种方法,如果你愿意来交互改变层动画速度。如果你想完全停止层,你应该使用尼科的答案,但使用这种方法与speed=0.0实际上将需要大约11天的动画完成,并在1小时动画将前进约0.0036