动画UIView的bounds属性

时间:2014-03-01 15:14:53

标签: ios uiview core-animation

根据可用的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控件变形(纵横比错误)并且显得拉长。

3 个答案:

答案 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)

设置边界的动画不会改变其值。一旦动画结束,它将恢复为原始值。

动画结束后,将边界的值更改为最终值。我会解决问题。