3

我正在实现一个游戏,其中有一些 CABasicAnimations。例如,像这样:

CABasicAnimation * borddroit = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
borddroit.fromValue = [NSNumber numberWithFloat:0.0f];
borddroit.toValue = [NSNumber numberWithFloat:749.0f];
borddroit.duration = t;
borddroit.repeatCount = 1;
[ImageSuivante2.layer addAnimation:borddroit forKey:@"borddroit"];

我用这个功能暂停了它:

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

当我的应用程序进入后台时,因为用户按下主页按钮,动画正确设置为暂停,但是当我重新打开我的应用程序时,动画消失了。

请问我该如何解决?

谢谢

4

4 回答 4

8

这是正确的内置行为。当您离开应用程序时,所有动画都会从它们的图层中删除:系统会removeAllAnimations在每个图层上调用。

这并不重要,通常是因为以下原因:假设您将一个球从 A 点设置为 B 点,并且当用户离开您的应用程序时,它在动画中到 B 点的一半。当用户回来时,动画消失了,但球B 点,所以应用程序可以继续。所发生的只是我们跳过了一些动画部分。

于 2013-04-06T15:16:21.307 回答
0

观察UIApplicationWillEnterForegroundNotification并重新设置动画CAAnimation

于 2015-06-26T10:36:24.537 回答
0

只需在您UIViewController或您的UIView班级中添加以下代码。无需恢复或重新开始动画。它会自己处理:)

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becomeActive:) name:UIApplicationWillEnterForegroundNotification object:nil];


-(void)becomeActive : (NSNotification*)notification
  {
    NSLog(@"app become active");
  }
于 2015-12-09T09:51:02.467 回答
0

当视图从可见区域消失时,所有动画都会被删除(不仅是当应用程序进入后台时)。为了修复它,我创建了自定义CALayer子类并覆盖了 2 个方法,因此系统不会删除动画 -removeAnimation并且removeAllAnimations

class CustomCALayer: CALayer {

    override func removeAnimation(forKey key: String) {

        // prevent iOS to clear animation when view is not visible
    }

    override func removeAllAnimations() {

        // prevent iOS to clear animation when view is not visible
    }

    func forceRemoveAnimation(forKey key: String) {

        super.removeAnimation(forKey: key)
    }
}

在您希望将此层用作主层覆盖layerClass属性的视图中:

override class var layerClass: AnyClass {

    return CustomCALayer.self
}

于 2020-03-05T09:20:57.373 回答