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