ios - UIView.layer.presentationLayer 返回最终值(而不是当前值)

标签 ios objective-c uiview core-animation calayer

下面是 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(结束值)而不是 between 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]);
});

有什么想法吗?

最佳答案

我不知道在动画代码中使用 KVC setter 的想法从何而来,但这就是动画本身的用途。您基本上是在用这一行告诉图层树立即更新到新位置:

[self.layer setValue:@200 forKeyPath:anim.keyPath];

然后想知道为什么图层树不会使用没有起始值或结束值的动画动画到该位置。没有什么可以动画的!适本地设置动画的 toValuefromValue 并放弃 setter。或者,如果您希望使用隐式动画,请保留 setter,但放弃动画并通过改变图层的 speed 来设置其持续时间。

关于ios - UIView.layer.presentationLayer 返回最终值(而不是当前值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22741496/

相关文章:

iOS 模拟器未连接到网络服务

ios - 检测图像结束

ios - 调用 UIPinchGestureRecognizer 后更改 UIView 的边界

ios - 如何在 ios 中为 UiView 添加顶部或底部边框?

ios - 1 个 ViewController 中的 2 个 UITableViews。将 Delegate 和 DataSource 设置为不同的 UITableViewController 文件

ios - 如何获取 UIWebView 中选中文本的坐标(CGRect)?

objective-c - 在 Objective C 中将可变长度的 int 数组作为函数参数传递

objective-c - 如何比较两个NSTimeInterval类型的对象

ios - Swift 2.1 与 removeFromSuperview 相反

ios - 通过FHSTwitterEngine发布图片