使用CABasicAnimation动画框架属性
我试图对这个基于UIView块的动画代码做一个精确的“翻译”:
[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
someView.frame = CGRect(0, 100, 200, 200);
}
completion:nil];
改为使用CABasicAnimation。
我完全知道frame属性实际上是底层图层的position,bounds和anchorPoint的组合,如下所示:http://developer.apple.com/library/mac/#qa/qa1620/_index html的
...我已经做出了这样的解决方案,使用两个CABasicAnimations一个设置位置,一个为界限,它适用于该视图。
然而,问题在于我在我的观点中有子视图。 someView有一个类型为UIScrollView的子视图,我在其中放置了另一个UIImageView类型的子视图。 UIScrollView子视图的autoresizingMask设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight。 如果我使用UIView基于块的版本,这一切都可以完美运行,但是当我尝试使用CABasicAnimations时,子视图开始意外行为(即,获取调整为不正确的宽度)。 所以看起来autoresizingMask在使用CABasicAnimations时无法正常工作。 我还注意到子视图不会接收到setFrame的调用,尽管父层视图的框架属性在对层位置和边界进行更改后确实发生了变化。
这就是为什么我想知道当用户使用UIView的animateWithDuration方法时会发生什么情况,用CABasicAnimation复制的正确代码是什么。
我完全知道框架属性实际上是底层图层的位置,边界和锚点的组合
好,但重要的是要意识到frame
不是图层的动画属性。 如果您想使用CABasicAnimation进行动画制作,则必须使用可用于图层的动画属性。 CALayer文档将每个这样的属性都标记为明确的“可动画”。 使用bounds
和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缺少该功能。
链接地址: http://www.djcxy.com/p/74185.html上一篇: Animate frame property using CABasicAnimation
下一篇: Is it safe to use CABasicAnimation with a keyPath of "frameOrigin"?