在 UIViewController 的 loadView 中确定 self.view 的大小

Posted

技术标签:

【中文标题】在 UIViewController 的 loadView 中确定 self.view 的大小【英文标题】:Determine self.view size in loadView of UIViewController 【发布时间】:2011-03-22 14:15:12 【问题描述】:

我有一个自定义的UIViewController 子类,我想覆盖loadView 方法。我遇到了一个问题,即在将self.view 添加到其父级(即UIViewControllerWrapperView)之前,我需要它的大小。如何获得要添加我的viewUIViewControllerWrapperView 的大小?

如果这不是常用的方法,那么我应该怎么做才能手动确定我的视图的未来大小(而不是依赖自动调整大小)?

编辑:

另外,这个UIViewControllerWrapperView 是什么时候创建和调整大小的?

【问题讨论】:

【参考方案1】:

除了尝试自己计算屏幕上的空间之外,目前的 SDK 可能性似乎无法实现我想要的。

我通过以更聪明的方式设置视图的自动调整大小掩码解决了我的问题。

编辑:原来我可以在-(void)viewWillAppear:(BOOL)animated 中确定我需要的大小。

【讨论】:

您介意分享一下如何确定-(void)viewWillAppear: 中的大小吗?我的自定义视图仍然没有大小,并且没有要调整的 superView。编辑:我已经将 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight 设置为 autoResizingMask,但这无济于事 @BobVork,我已经有一年多没有使用该代码库了,已经忘记了那里到底发生了什么。我认为这与使用 CGRectZero 初始化视图然后设置自动调整大小掩码(您已经拥有)有关。在此处查看相关代码 - pastebin.com/m8kNqJbY【参考方案2】:

如果您要覆盖视图控制器的 -loadView 方法,则需要在那里创建整个视图层次结构。

编辑:我之前建议致电[super loadView],但我注意到文档说不要这样做。

【讨论】:

@Caleb,我不想使用 nib 文件。我想知道当我在 loadView 时的可用空间,以便我可以在那里获得它的尺寸。问题是我不知道我的视图会有多大,我需要它。 您可以使用[[UIScreen mainScreen] applicationFrame] 来获取视图应填充的大小。 @Caleb,我不需要应用程序框架 - 我需要 UIViewControllerWrapperView 大小。这将与应用程序框架不同,因为我的自定义视图控制器是导航控制器的一部分。 我认为您正在寻找的信息在-loadView 期间不可用,因为视图控制器必须先加载其视图,然后才能将视图添加到导航控制器的视图。您可以创建一个知道如何在-layoutSubviews 中排列其子视图的自定义视图,或者您可以在-viewWillAppear 中排列您的视图。或者,您可以假设某个大小,例如 416x320(416 = 屏幕高度 -(导航栏 + 状态栏)),这基本上是大多数人在他们的 nib 文件中所做的。 我有一个自定义视图并且正在 lyoutSubviews 中进行布局。但是,我在 viewDidLoad 之后不久创建了我的视图,此时,我的自定义视图控制器的视图属性没有父级并且没有自动调整大小。因此,当我尝试布局自定义视图时遇到了问题。【参考方案3】:

根据View Controller Programming Guide:

如果没有从情节提要中加载视图控制器,请创建一个 特定于您的视图控制器的自定义初始化方法。 这个方法应该调用超类的init方法然后执行 任何特定于类的初始化。

这似乎表明子视图控制器应该通过自定义初始化器传递父视图大小信息。

【讨论】:

【参考方案4】:

处理当前视图(或视图控制器)大小的正确方法是不用担心它,只需使用 AutoLayout 或(旧方法)自动调整大小掩码在此视图中自然地布局。

在某些时候,您当然可以弄清楚自己的尺寸是多少,但您应该尝试重做您的设计,以便您的布局都是相对的。而不是说“我的宽度是 320,所以这个子视图的宽度应该是 280,每边 20 像素”,你可以使用 AutoLayout 来有效地说“让子视图在左右两边都有一个 20 像素的缓冲区,并占据剩下的任何宽度”。等等。

【讨论】:

感谢您的回答,但在我最初发布问题并找到解决问题的方法一年多之后,才引入了 AutoLayout。当时,如果我有 AutoLayout,我的生活会简单得多:)

以上是关于在 UIViewController 的 loadView 中确定 self.view 的大小的主要内容,如果未能解决你的问题,请参考以下文章

问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the vie

UIViewController函数调用顺序

UIViewController 最佳实践——加载

iOS认识load方法

UIViewController 未调用 viewDidLoad 且未创建 UIView 导致崩溃

何时启动/加载 UIViewController 元素(通过 Main.storyboard 中的 IB 创建)?