UIView动画是否依赖于设置属性的顺序?

时间:2012-10-09 10:38:04

标签: cocoa-touch uiview uiviewanimation

我遇到了UIView动画的奇怪之处。动画缩放子视图  从矩形填充其父视图:

//update views
CGRect startRect = ...; //A rect in parentView co-ordinates space that childView appears from
UIView *parentView = ...;
UIView *childView = ...;
[parentView addSubview:childView];

//animation start state
childView.alpha = 0;
childView.center = (CGPointMake( CGRectGetMidX(startRect),  CGRectGetMidY(startRect)));
//TODO: set childViews transform and so that it is completely contained with in startRect
childView.transform = CGAffineTransformMakeScale(.25, .25); 

[UIView animateWithDuration:.25 animations:^{
    childView.transform = CGAffineTransformIdentity;        
    childView.alpha = 1;
    childView.frame = parentView.bounds;
}];

上面的代码按预期工作。但是,如果将动画块重新排序到以下内容,则动画会变得混乱(大规模缩放,中心点不在屏幕上):

[UIView animateWithDuration:.25 animations:^{
    childView.frame = parentView.bounds; //This line was after .alpha
    childView.transform = CGAffineTransformIdentity;        
    childView.alpha = 1;
}];

这里发生了什么?为什么属性设置的顺序对动画有意义?

1 个答案:

答案 0 :(得分:1)

属性的顺序可能是相关的,因为当变换不是标识变换时,帧是未定义的。

  

警告:如果transform属性不是标识转换,则此属性的值未定义,因此应忽略。

From the documentation for frame (on UIView)

这对于获取帧值是正确的,但我相信它也适用于设置帧。

我几乎可以肯定,动画块的更改发生在视图层的模型上,然后在视图层的表示上进行动画处理。< / p>

由于您要进行变换为比例的状态,因此设置框架是未定义的。

在上面的示例中,变换在设置帧之前设置为identity,因此它按预期工作,但在第二个示例中,您在恢复变换之前设置帧。