2014-03-01 73 views
1

根据可用的Apple文档here,可以动画UIView的bounds属性。动画UIView的边界属性

为了编程旋转自己的看法(在这种情况下,从纵向到横向)之一,我实现了下面的代码:

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,因为我已经在计算器上的某个地方阅读必须将contentMode设置为该值,以便UIView在修改bounds属性时重绘内容(但在这种情况下,它不会以任何方式影响行为)。

该代码的问题是,UIView没有动画调整大小,但一次。

执行该代码,首先调整UIView的大小(没有动画),然后用动画旋转。

如何为调整大小设置动画效果?

- 更新 -

我试图缩放和旋转改造结合起来。 UIView在动画中旋转和缩放,但最后它的bounds属性不会改变:即使它已经旋转到横向(我的iPhone应该是568x320),其宽度和高度仍然保持纵向值( 320x568)。事实上,controlsView上的UI控件变形(错误的宽高比)并显得拉长。

+0

为什么不使用缩放和旋转变换? – Wain

回答

0

问题是,当您设置transform属性时,所有其他转换(bounds)都将被覆盖。要修复它,你必须创建一个transform,结合缩放旋转

例子:

CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.5, 0.5); 

[UIView animateWithDuration:1.0 animations:^ 
{ 
    controlsView.transform = CGAffineTransformRotate(scaleTransform, M_PI/2); 
}]; 

你需要计算基于你想拥有在动画的最后大小缩放XY值。您可能还想要更改anchorPoint属性以设置用于缩放的中心点(controlsView.layer.anchorPoint)。

+0

根据文档,我应该能够在使用特定的'trasnform'时动画'bounds'属性。这是文档为“frame”属性报告的内容: 修改此属性以相对于其超级视图的坐标系更改视图的大小和位置。 (如果transform属性不包含标识转换,请修改边界或中心属性。) –

1

这个工作我使用 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)

0

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

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