【问题标题】:Why is an implicit animation overriding my CABasicAnimation?为什么隐式动画会覆盖我的 CABasicAnimation?
【发布时间】:2013-01-31 14:19:29
【问题描述】:

每次用户执行某项操作时,我都会尝试将 CALayer 移动几个点。我将动画设置为相对缓慢地运行,但是当我在设置动画后设置图层的位置时,隐式动画似乎接管并快速执行动画。这基本上是我的代码的样子:

    CGPoint point = CGPointMake(layer.position.x + 30, layer.position.y + 30);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [NSValue valueWithCGPoint: layer.position];
    animation.toValue = [NSValue valueWithCGPoint: point];
    animation.duration = 4;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    [layer addAnimation:animation forKey:@"position"];
    layer.position = point;

我尝试删除最后一个layer.position = point 行,这会导致第一个动画按预期运行,但是当我第二次尝试运行动画时,图层会跳回到我运行第一个动画之前的图层位置.目前,我能够解决此问题的唯一方法是向实现animationDidStop 的动画添加一个委托,并在动画完成后设置图层的点。但是查看很多其他人的示例代码,这不应该是必需的。是不是我做错了什么?

【问题讨论】:

  • 你不会在同一层重复添加动画吧?我注意到您有 removedOnCompletion = NO 并且您没有显示从图层中删除动画的代码...
  • layer 到底是什么?你能展示你如何初始化layer 变量吗?除此之外:我想如果你使用removedOnCompletion = YES,那么图层会在动画完成后立即回到初始位置,是吗?
  • @trojanfoe 我正在尝试多次重复相同的动画块而不从图层中删除动画。 @sergio 该层是一个 CAShapeLayer,现在只是一个圆圈。如果我使用removedOnCompletion = YES 或删除animation.fillMode = kCAFillModeForwards,那么在动画完成后图层会重新回到原来的位置。我的目标是每次运行动画时逐步移动图层。

标签: ios animation core-animation calayer


【解决方案1】:

你应该看看WWDC'11 session 421 - Core Animation Essentials,在 45:21 有一个与你类似的例子。

他们首先在图层上设置新值,创建动画然后将其添加到图层。 您必须注意的一件事是fillMode 属性,它应该是kCAFillModeBackwards

【讨论】:

    【解决方案2】:

    您无需与removedOnCompletionfillMode 混淆。由于隐式动画,您看到的不正确位置是 not。您唯一没有做的就是在在运行动画之前设置图层的新位置。您的问题是您 添加动画后设置了新位置。以下是 Swift 3 中函数式版本的外观:

    let newPoint = CGPoint(x: layer.position.x + 30, y: layer.position.y + 30)
    
    let animation = CABasicAnimation(keyPath: "position")
    animation.fromValue = NSValue(cgPoint: layer.position)
    animation.toValue = NSValue(cgPoint: newPoint)
    
    layer.setValue(NSValue(cgPoint: newPoint), forKeyPath: "position")
    
    layer.add(animation, forKey: nil)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2021-04-13
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多