暂停和恢复加载屏幕的CABasicAnimation?

时间:2013-04-03 14:21:11

标签: ios objective-c cabasicanimation

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

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

以下是Nico's回答的快速3版本。

希望有所帮助!

continueButton = (Button)view.findViewById(R.id.continue);
continueButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {               
                showMainActivity();
                finish();
            }
        });

答案 2 :(得分:0)

如果视图被隐藏(根本不在界面中),那么它就不是渲染树的一部分。

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

中重新创建动画

答案 3 :(得分: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