屏幕旋转后获取自动旋转 UIView 的尺寸?
Posted
技术标签:
【中文标题】屏幕旋转后获取自动旋转 UIView 的尺寸?【英文标题】:Get dimensions an autorotated UIView will be given after screen is rotated? 【发布时间】:2012-05-06 04:44:47 【问题描述】:问题: 是否有可能在屏幕旋转后获得自动旋转的UIView的大小,但是在旋转完成之前获得这个值 ?如果有,怎么做?
背景:我正在构建一个 iPad 应用程序,它有一个屏幕,其中几个 UILabel 在包含 UIView 的列中排列(小于屏幕的主 UIView。)标签的数量和每个标签中的文本长度在编译时是未知的。它们在运行时通过一种算法在屏幕上动态布局,该算法试图选择最佳的列数和宽度,以防止内容从屏幕上被剪掉。为了使重新调整过程对用户来说尽可能顺利,我相信我需要在以下内部执行此操作:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
当然,这个方法是在旋转完成之前调用的,因此需要提前知道包含 UIView 的大小。
【问题讨论】:
【参考方案1】:在 ios 5 中,viewWillLayoutSubviews
将实现您的目标。
在 iOS 4 中,您可以通过为控件/子视图的移动设置动画来减少移动的震动,即使它发生在 didRotateFromInterfaceOrientation
中(我知道这听起来不像,但它使巨大的差异)。因此,如果您想为按钮移动到 newFrame 设置动画,就这么简单:
[UIView animateWithDuration:0.25 animations:^
[button setFrame:newFrame];
];
最后,明智地使用autoResizingMask
也有很大帮助,尽管我认为这是不可能的,因为您正在相互移动控件。
【讨论】:
谢谢罗伯特。viewWillLayoutSubviews
成功了。由于在为容器分配新大小后的自动旋转操作期间调用此方法,因此无需通过任何额外的技巧来获取它。 container.frame.size
按预期工作。【参考方案2】:
退房:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
您可以在这里找到所有这些方法:
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html
【讨论】:
我知道这种方法,谢谢。我不想在那里做,因为这意味着视图会旋转,并且然后标签都将卡入一个新的位置或大小。我希望在轮换完成时一切都准备就绪。 在 iOS 5 上,viewWillLayoutSubviews
甚至更好,将其作为轮换的一部分。
在 iOS 4 中,您可以通过为移动设置动画来使移动不那么刺耳,即使它发生在 didRotateFromInterfaceOrientation 中(我知道这听起来不像,但它有很大的不同)。此外,明智地使用 autoResizingMask(90% 的时间,它可以完成这项工作)也非常有帮助。
谢谢罗伯特。不幸的是 autoResizeMask 不起作用,因为在某些情况下我不得不绘制新列并移动一些标签,而不仅仅是调整那里的大小。不过,我确实期待在某个时候了解更多有关自定义动画的信息。
动画是微不足道的:例如,移动按钮,想出newFrame,我只是做[UIView animateWithDuration:0.25 animations:^ [button setFrame:newFrame]; ];
。而且,我认为您也会对 viewWillLayoutSubviews 感到非常满意,因为它完全符合您的要求(尽管仅适用于 iOS 5)。以上是关于屏幕旋转后获取自动旋转 UIView 的尺寸?的主要内容,如果未能解决你的问题,请参考以下文章
使用自动布局强制 UITableView 中的 UIView 填满屏幕