为啥我替换了一个 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