动画使用CABasicAnimation帧属性(Animate frame property usi

2019-07-22 19:49发布

我试图做一个确切的“翻译”这个UIView的基于块的动画代码:

[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                               someView.frame = CGRect(0, 100, 200, 200);
                             }
                 completion:nil];

使用CABasicAnimation来代替。

我完全意识到,框架属性是实际的下层的位置边界anchorPoint的组合,因为它是这里描述: http://developer.apple.com/library/mac/#qa/qa1620/_index html的
......我已经作出这样的一个解决方案,使用两个CABasicAnimations一个设定的位置 ,一个用于边界和它的作品为一个视图。

然而,问题是,我有我的观点里子视图。 someView有型的UIScrollView的子视图中,我将仍然类型的UIImageView的另一个子视图。 UIScrollView的子视图具有autoresizingMask设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight。 这一切都完美地工作,如果我使用的UIView基于块的版本,但是当我尝试使用CABasicAnimations子视图开始出现行为异常(即得到调整大小不正确的宽度)。 如此看来使用CABasicAnimationsautoresizingMask无法正常工作。 我还注意到,子视图没有收到用于SETFRAME一个电话虽然父视图的框架属性不更改后变为层位置和界限制成。

这就是为什么我想知道什么是正确的代码CABasicAnimation,当一个人使用的UIView的animateWithDuration方法正在发生的事情进行复制。

Answer 1:

我完全意识到,框架属性是实际的下层的位置,边界和anchorPoint组合

好,但要知道,同样重要的是frame不是一个图层属性动画。 如果你想与CABasicAnimation制作动画必须使用的动画图层的属性。 该CALayer的文件,标志着每一个这样的财产明确的“动画”。 使用的想法boundsposition是正确的。

因此,这段代码基本上是你做之前:

[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版缺少的功能。



文章来源: Animate frame property using CABasicAnimation