5

这是我在这里遇到的问题的延续(仍未解决):link

但这可能有助于了解问题所在。我只创建了一个简单的测试项目(“空应用程序”)并添加了一个带有 XIB 文件的视图控制器(复选框:“选择了用于用户界面的 XIB 文件”)。代码如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"didLoad: %@",NSStringFromCGRect(self.view.bounds));

    // Do any additional setup after loading the view from its nib.
}

-(void) viewDidAppear:(BOOL)animated
{
    NSLog(@"didAppear: %@",NSStringFromCGRect(self.view.bounds));

}

这是输出:

2013-07-26 17:05:28.502 testtest[5926:c07] didLoad: {{0, 0}, {320, 548}}
2013-07-26 17:05:28.506 testtest[5926:c07] didAppear: {{0, 0}, {320, 460}}

他们怎么不一样?

(ps。我在 6.1 模拟器上测试)

4

5 回答 5

3

viewDidLoad调用该方法时,您的视图控制器刚刚从您的故事板或 XIB 加载,因此视图尺寸与您在 XIB 中的尺寸相同(看起来像 iPhone 5 的高度尺寸)。

后来,当viewDidAppear:被调用时,视图已经出现在屏幕上,因此它已经适当调整大小以实际适合屏幕,因此它的尺寸可能与您故事板中的尺寸不同,因此与在视图已加载。

在您的情况下,您的情节提要或 XIB 文件似乎设置为 iPhone 5 屏幕尺寸(548 = 1136/2 - 状态栏),并且您正在 iPhone 5 之前的模拟器或具有 480x320 点屏幕的设备中进行测试,所以视图被调整为 460 点高以适应屏幕。

于 2013-07-26T13:22:58.083 回答
1

这可能有完美的意义。

ViewDidLoad在第一次访问时被懒惰地调用controller.view,所以到那时框架还没有设置。这意味着此时您不能依赖帧/边界大小,因为它只包含一个默认值(尽管在许多情况下它是正确的)。在ViewDidAppear中,通常会设置帧,尽管如果您的父控制器正在设置任何动画,您也可以有一个临时帧状态而不是最后一个,但这并不常见,因为按照惯例,当视图已经显示时调用此方法。

例如,如果您从 IB 文件加载视图,您将获得的框架viewDidLoad是您在 IB 文件中拥有的框架,但您的视图的最终尺寸可能更小/更大,然后您将获得另一个一个在你的viewDidAppear.

取而代之的是,您应该创建所有可调整大小的元素(使用 Spring&Struts、AutoLayout 或任何其他类似的替代方法),以便在设置框架时正确显示它们。

于 2013-07-26T13:23:50.323 回答
0

当 aViewController呈现其视图时,它通常会缩小该视图,使其框架不会与设备的状态栏重叠。

因此,当您NSLog进入时viewDidLoad,我尚未加载的视图尚未ViewController缩小框架,但在 中viewDidAppear,它已经完成了大小调整。有一处房产在UIViewController
wantsFullScreenLayout

将此属性设置为 YES 会导致视图控制器调整其视图的大小,以便它填满整个屏幕,包括状态栏下方的区域。(当然,要做到这一点,托管视图控制器的窗口本身必须调整大小以填满整个屏幕,包括状态栏下方的区域。)如果您具有半透明状态,通常会将此属性设置为 YES栏并希望您的视图内容在该视图后面可见。

于 2013-07-26T13:21:25.340 回答
0

-viewDidLoad被称为第一次viewController.view被称为。在返回视图之前调用它。这有一个非常重要的含义。为了显示视图或调整视图大小,需要将其添加到窗口或其他视图中。

这是怎么发生的?它看起来像[window addSubview:viewController.view].

因此,在将其放入视图层次结构之前,需要完全加载的视图。这对self.view-viewDidLoad.

  1. self.view.superview并且self.view.window永远都是nil
  2. self.view尺寸尚不适合self.view.superview.

有了这个理解,你可以看到调用self.view时如何无法知道它的最终大小-viewDidLoad


更新

如果您需要将自定义布局应用到视图的子视图,您可能需要考虑子类化UIView和使用-[UIView layoutSubviews].

除此之外,您是否遇到了麻烦,-viewWillAppear:而不是-viewDidAppear:-viewWillAppear:在视图显示之前调用,因此在调整视图大小时不会有奇怪的视觉效果。

于 2013-07-26T19:11:35.497 回答
0

据我所知,ViewDidLoad 将按照定义为您的应用程序设置边界,在根视图的 RootViewController/XIB 文件中,或者可能是 AppDelegate。

如果您在此处定义应用程序边界(不确定其中哪一个),则整个应用程序中的 ViewDidLoad 函数最初将根据该边界设置高度。

一旦视图被加载并准备好“出现”,就可以请求实际的边界。因此建议在 ViewWillAppear/ViewDidAppear 方法中请求边界/大小。

于 2013-07-26T13:45:54.167 回答