我正在尝试对此进行精确的“翻译”UIView基于块的动画代码:
[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
someView.frame = CGRect(0, 100, 200, 200);
}
completion:nil];
using CA基本动画反而。
我完全知道框架属性实际上是以下内容的组合position, bounds and 锚点底层的,如下所述:http://developer.apple.com/library/mac/#qa/qa1620/_index.html
...我已经做了一个这样的解决方案,使用两个CA基本动画一个设置position, 一个用于bounds它适用于该一种视图。
然而问题是我的视图中有子视图。 someView 有一个 type 的子视图UI滚动视图我在其中放置了另一个类型的子视图UI图像视图. UI滚动视图子视图有自动调整大小蒙版 set to UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleWidth UIView自动调整大小灵活高度。如果我使用的话,一切都会完美地进行UIView基于块的版本,但是当我尝试使用CA基本动画子视图开始表现异常(即将大小调整为不正确的宽度)。所以它看起来自动调整大小蒙版使用时无法正常工作CA基本动画。我还注意到子视图没有收到调用设置框架:,尽管在更改图层位置和边界后,父视图的框架属性确实会发生变化。
这就是为什么我想知道复制的正确代码是什么CA基本动画当一个人使用 UIView 时会发生什么动画持续时间方法。
我完全知道框架属性实际上是底层的位置、边界和锚点的组合
很好,但重要的是要意识到frame
不是图层的可动画属性。如果您想使用 CABasicAnimation 进行动画处理,则必须使用可对图层进行动画处理的属性。 CALayer 文档将每个此类属性明确标记为“可动画化”。使用的想法bounds
and position
是正确的。
因此,这段代码基本上完成了您之前所做的事情:
[CATransaction setDisableActions:YES];
// set final bounds and position
v.layer.bounds = CGRectMake(0,0,200,200);
v.layer.position = CGPointMake(100,200);
// cause those changes to be animated
CABasicAnimation* a1 = [CABasicAnimation animationWithKeyPath:@"bounds"];
a1.duration = 0.5;
CABasicAnimation* a2 = [CABasicAnimation animationWithKeyPath:@"position"];
a2.duration = 0.5;
[v.layer addAnimation:a1 forKey:nil];
[v.layer addAnimation:a2 forKey:nil];
但是,该代码对任何子层的大小没有影响v.layer
。 (子视图v
由子层绘制v.layer
.) 不幸的是,这就是您要解决的问题。我相信,通过下降到图层级别并直接显式核心动画,您已经放弃了自动调整大小,这发生在视图级别。因此,您还需要为子图层设置动画。这就是视图动画为您所做的事情。
这是 iOS 的一个不幸的功能。 Mac OS X 具有图层约束 (CAConstraint),它在图层级别执行自动调整大小在视图级别(以及其他级别)执行的操作。但 iOS 缺少这个功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)