根据可用的Apple文档here,可以动画UIView的bounds
属性。
为了以编程方式旋转我的一个视图(在这种情况下从纵向到横向),我实现了以下代码:
float w = controlsView.bounds.size.width;
float h = controlsView.bounds.size.height;
CGAffineTransform T = CGAffineTransformMakeRotation(M_PI/2);
UIViewContentMode oldContentMode = controlsView.contentMode;
controlsView.contentMode = UIViewContentModeRedraw;
[UIView animateWithDuration:1.0 animations:^{
controlsView.bounds = CGRectMake(0, 0, h, w);
controlsView.transform = T;
}];
controlsView.contentMode = oldContentMode;
我添加了contentMode
的两条指令,因为我已经在StackOverflow上的某处读过contentMode
必须设置为该值,以便UIView在bounds
属性时重绘内容被修改(但是,在这种情况下,它不会以任何方式影响行为)。
该代码的问题在于UIView没有使用动画调整大小,而是一次性调整大小。
执行该代码时,首先调整UIView的大小(不带动画),然后用动画旋转。
如何设置调整大小的动画?
- 更新 -
我尝试结合缩放和旋转变换。 UIView在动画中旋转和缩放,但最后它的bounds
属性不会改变:即使它已被旋转到横向(我的iPhone应该是568x320),它的宽度和高度仍保持不变肖像值(320x568)。实际上,controlsView
上的UI控件变形(纵横比错误)并且显得拉长。
答案 0 :(得分:2)
这对我使用 UIViewAnimationOptions.LayoutSubviews (Swift):
UIView.animateWithDuration(1.0,delay:0.0,
options:UIViewAnimationOptions.LayoutSubviews,
animations:{ () -> Void in
myView.transform = myRotationTransform
myView.bounds = myBounds
}, completion: nil)
(没有明确缩放或更改contentMode)
答案 1 :(得分:0)
问题是,当您设置transform
属性时,所有其他转换(bounds
)都会被覆盖。要解决此问题,您必须创建一个{<1>},其中包含缩放和旋转。
示例:
transform
您需要根据动画结尾处想要的尺寸计算缩放CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.5, 0.5);
[UIView animateWithDuration:1.0 animations:^
{
controlsView.transform = CGAffineTransformRotate(scaleTransform, M_PI/2);
}];
和X
值。您可能还想更改Y
属性以设置用于缩放的中心点(anchorPoint
)。
答案 2 :(得分:0)
设置边界的动画不会改变其值。一旦动画结束,它将恢复为原始值。
动画结束后,将边界的值更改为最终值。我会解决问题。