【发布时间】:2014-03-30 07:38:10
【问题描述】:
这是 UIView 子类中的一些相关代码:
- (void) doMyCoolAnimation {
CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"position.x"];
anim.duration = 4;
[self.layer setValue:@200 forKeyPath:anim.keyPath];
[self.layer addAnimation:anim forKey:nil];
}
- (CGFloat) currentX {
CALayer* presLayer = self.layer.presentationLayer;
return presLayer.position.x;
}
当我在动画运行时使用[self currentX] 时,我得到200(结束值)而不是介于 0(开始值)和200 之间的值。是的,动画对用户是可见的,所以我在这里真的很困惑。
这是我调用 doMyCoolAnimation: 的代码,以及 1 秒后调用 currentX 的代码。
[self doMyCoolAnimation];
CGFloat delay = 1; // 1 second delay
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
NSLog(@"%f", [self currentX]);
});
有什么想法吗?
【问题讨论】:
-
如果您在动画添加到图层后立即调用 getter,您应该得到接近 0.4 的值。尝试将您的 get 包裹在
dispatch_after() -
@CodaFi 我知道这一点并且已经在使用
dispatch_after()。我正在检查一个有效的时间,但presentationLayer假装它是一个模型层(我困惑的根源)。 -
从动画中分离出KVC setter,然后从KVC setter中分离出动画,看看我的意思。在其当前形式下,动画将不执行任何操作,KVC 设置器将使图层以默认的隐式动画速度弹到其下一个位置。
标签: ios objective-c uiview core-animation calayer