将 UIViewController 的视图调整为父 UIWindow 的边界

Posted

技术标签:

【中文标题】将 UIViewController 的视图调整为父 UIWindow 的边界【英文标题】:Size a UIViewController's view to parent UIWindow's bounds 【发布时间】:2015-03-18 19:02:42 【问题描述】:

我想为UIViewControllerview 指定与设备屏幕尺寸不同的尺寸。我知道我通常可以通过将视图控制器添加为另一个父级 UIViewController 的子视图控制器来实现这一点,该父级已为孩子定义了一个框架,但我的情况似乎有点不同。

我有一个UIWindow,它只占据屏幕的一部分(它有一个基本上是(0, 0, DEVICE_WIDTH, HEIGHT_LESS_THAN_DEVICE_HEIGHT) 的框架。这个窗口在出现时显示了正确的大小和位置。我将视图控制器设置为窗口的rootViewController,然后通过将其hidden 值设置为false 来呈现窗口。当这种情况发生时,视图控制器的视图最终会被调整为填充设备的屏幕(即(0, 0, DEVICE_WIDTH, DEVICE_HEIGHT) 的框架)。

我希望视图控制器从UIWindow 继承其大小,它被设置为根视图控制器。有没有办法做到这一点?

我也尝试过覆盖loadView() 并在那里返回一个自定义大小的视图。记录视图显示视图控制器的view 对象在viewDidLoad 期间的大小正确,但被viewWillAppear: 覆盖为默认大小。如果无法从窗口继承大小,我愿意使用loadView() 来调整视图控制器的大小,但我不知道如何使自定义大小保持不变。

注意:我之所以尝试在窗口中添加视图控制器,是因为我想利用viewDidAppear:之类的视图控制器生命周期方法,这就是我的原因不仅仅是创建一个简单的UIView 并将其添加为窗口的子视图。

【问题讨论】:

【参考方案1】:

虽然看起来很反直觉,但如果您在 viewWillAppear (ios 8) 或 viewDidAppear (IOS 7) 上设置了 set self.view.frame,您将能够使其工作。

Swift 代码(IOS 8):

override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)

        // Banner style size, for example
        self.view.frame = CGRectMake(0, 0, 320, 50) 

对于 IOS 7,我不得不使用 viewDidAppear,这显然是一个不能令人满意的解决方案。因此,在修改 self.view.frame 之后,我必须以 alpha = 0.0 开始视图并在 viewDidAppear 上设置 alpha = 1.0。

希望对你有帮助。

【讨论】:

这似乎是解决问题的好方法,但不完全是我想要的路径。绝对看起来是一个值得的策略,但我很想看看是否有办法让视图控制器从它的环境中而不是从默认值中获取这些信息。 在 viewDidAppear 上,您可以访问窗口对象 (self.view.window)。您可以设置 self.view.frame 以匹配窗口的框架。您还可以将参数发送给您的控制器,然后再将其设置为新窗口的 rooViewController。 我们真的不应该通过CGRectMake(0, 0, 320, 50) 硬编码帧大小,这不会适应不同的屏幕尺寸。

以上是关于将 UIViewController 的视图调整为父 UIWindow 的边界的主要内容,如果未能解决你的问题,请参考以下文章

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

调整 UIViewController 中的视图大小

UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]

调整UIViewController的大小以导出其视图

UIViewController 的视图奇怪的调整大小行为

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小