我遇到了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;
}];
这里发生了什么?为什么属性设置的顺序对动画有意义?
答案 0 :(得分:1)
属性的顺序可能是相关的,因为当变换不是标识变换时,帧是未定义的。
警告:如果
transform
属性不是标识转换,则此属性的值未定义,因此应忽略。
From the documentation for frame
(on UIView
)。
这对于获取帧值是正确的,但我相信它也适用于设置帧。
我几乎可以肯定,动画块的更改发生在视图层的模型上,然后在视图层的表示上进行动画处理。< / p>
由于您要进行变换为比例的状态,因此设置框架是未定义的。
在上面的示例中,变换在设置帧之前设置为identity,因此它按预期工作,但在第二个示例中,您在恢复变换之前设置帧。