我已经实现了一个LoadingLayer类,它有一些动画元素(确切地说是2个),这些动画元素用CABasicAnimation
动画。现在,这个加载屏幕视图在整个应用程序中持续存在。隐藏视图是否会停止所有动画?或者让我重述一下:是否有很多记忆我不得不担心或可能导致滞后?我尝试使用-pauseLayer:
和-resumeLayer:
方法,但是由于在我的应用程序中使用了多线程,它们导致了一些问题。因此,只需隐藏并显示其动画一直运行的加载屏幕即可?暂停并恢复CABasicAnimation的加载屏幕?
6
A
回答
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
如果视图是隐藏的(不可见或没有在接口的话),则它是不呈现树的一部分。
但是,为什么不简单地停止动画时,其视图中嵌入图层的视图控制器离开界面(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
相关问题
- 1. PhoneGap/Cordova空白屏幕暂停/恢复
- 2. 暂停并恢复下载flex?
- 3. 暂停并恢复与pycurl下载
- 4. 暂停屏幕
- 5. 从全屏幕时TabActivity问题从暂停恢复时
- 6. 暂停/恢复下载的com.mozillaonline
- 7. lftp暂停和恢复下载
- 8. 暂停/恢复http连接下载
- 9. 使用URLStream暂停/恢复下载?
- 10. 在加载时停止applet执行,使用javascript暂停/恢复?
- 11. 暂停并恢复运行mysql查询
- 12. 暂停并恢复C++函数
- 13. 暂停和恢复的NSTimer
- 14. 恢复主屏幕
- 15. VIM屏幕恢复
- 16. 如何让屏幕暂停?
- 17. ChartBoost广告暂停屏幕
- 18. 暂停和恢复流
- 19. 暂停和恢复线程
- 20. 暂停和恢复方法
- 21. 如何暂停/恢复NSTIMER?
- 22. 暂停/恢复jquery .animate()?
- 23. 暂停和恢复BackgroundWorker
- 24. 暂停和恢复AsyncTasks? (Android)
- 25. Cocos2d引擎 - 暂停,恢复
- 26. 暂停/恢复线程?
- 27. Twilio播放暂停/恢复
- 28. NSOperationQueue暂停和恢复?
- 29. VB.net BackgroundWorker暂停/恢复
- 30. 暂停和恢复SKScene
我有一个非常相似实施但你的作品,谢谢! –
好的,不,实际上我有完全相同的实现。但现在我知道它为什么不时停止工作。每当应用程序进入后台并重新启动时,动画将不会再次恢复。任何想法可能会造成这种情况? –
尝试清除动画并在didBeomceActive上读取它们 – Nico