【问题标题】:Get dimensions an autorotated UIView will be given after screen is rotated?屏幕旋转后获取自动旋转 UIView 的尺寸?
【发布时间】:2012-05-06 04:44:47
【问题描述】:

问题: 是否有可能在屏幕旋转后获得自动旋转的UIView的大小,但是在旋转完成之前获得这个值 ?如果有,怎么做?

背景:我正在构建一个 iPad 应用程序,它有一个屏幕,其中几个 UILabel 在包含 UIView 的列中排列(小于屏幕的主 UIView。)标签的数量和每个标签中的文本长度在编译时是未知的。它们在运行时通过一种算法在屏幕上动态布局,该算法试图选择最佳的列数和宽度,以防止内容从屏幕上被剪掉。为了使重新调整过程对用户来说尽可能顺利,我相信我需要在以下内部执行此操作:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

当然,这个方法是在旋转完成之前调用的,因此需要提前知道包含 UIView 的大小。

【问题讨论】:

    标签: ios autorotate


    【解决方案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)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多