1

我遇到了一些奇怪的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;
}];

这里发生了什么?为什么属性设置的顺序对动画很重要?

4

1 回答 1

1

属性的顺序可能是相关的,因为当变换不是恒等变换时,框架是未定义的。

警告:如果该transform属性不是恒等变换,则该属性的值未定义,因此应被忽略。

来自frame(on UIView)的文档。

这对于获取框架值是正确的,但我相信对于设置框架也是如此。

我几乎可以肯定,您的动画块中的更改发生在视图层的模型上,然后它们在视图层的呈现上被动画化。

由于您正在形成一个转换为比例的状态,因此设置框架是未定义的。

在您的顶级示例中,转换在设置框架之前设置为标识,因此它按预期工作,但在第二个示例中,您在恢复转换之前设置了框架。

于 2012-10-09T11:12:14.990 回答