为啥我替换了一个 CALayer 的位置隐式动画,它仍然在我自己的位置之前开始?

Posted

技术标签:

【中文标题】为啥我替换了一个 CALayer 的位置隐式动画,它仍然在我自己的位置之前开始?【英文标题】:how come I replace a CALayer's position implicit animation and it still kicks in just before my own?为什么我替换了一个 CALayer 的位置隐式动画,它仍然在我自己的位置之前开始? 【发布时间】:2012-05-02 02:19:48 【问题描述】:

我正在做这样的事情:

  CABasicAnimation* translateA = [CABasicAnimation animation];
  translateA.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  translateA.fillMode = kCAFillModeBoth;
  translateA.duration = 1;

  CALayer* nextLayer = <some layer...>
  [nextLayer addAnimation:translateA forKey:@"position.y"];
  newPos = nextLayer.position;
  newPos.y += someDelta;
  nextLayer.position = newPos;

然后我看到图层几乎“跳”到它的最终位置,然后我的动画开始了。我猜“几乎跳”实际上是“位置”的原始隐含动画(在期间)。我还尝试替换位置而不是 position.y 并尝试替换图层中的整个动作字典(只是添加此动画)。但我总是得到相同的结果。

我将如何做才能有效地只看到图层平移 1 秒?

【问题讨论】:

【参考方案1】:

你能显示更多代码吗?我在drawInContext:中使用自定义属性时遇到了这个问题

我在自己的层中有这个:

+ (BOOL)needsDisplayForKey:(NSString *)key

    if ([key isEqualToString:@"progress"])
        return YES;
    else
        return [super needsDisplayForKey:key];

当这样做时:

[self.layer setValue:@1 forKey:@"progress"];

然后:

[self.layer addAnimation:animation forKey:@"progress"];

drawInContext: 在动画开始之前被调用,进度为 1。结果问题是我正在用@dynamic 合成属性(进度)。删除它实际上解决了我的问题:-)

【讨论】:

以上是关于为啥我替换了一个 CALayer 的位置隐式动画,它仍然在我自己的位置之前开始?的主要内容,如果未能解决你的问题,请参考以下文章

通过 AVExportSession 导出带有隐式动画的 CALayer

选择性地覆盖 CALayer 隐式动画

CALayer“内容”属性上的隐式动画

在 -[CALayer setNeedsDisplayInRect:] 中禁用隐式动画

iOS边练边学--CALayer,非根层隐式动画,钟表练习

隐式动画和核心动画