gpt4 book ai didi

iphone - 为什么我必须在 viewDidLoad 中手动设置 View 的框架?

转载 作者:行者123 更新时间:2023-12-03 18:15:04 24 4
gpt4 key购买 nike

我在 UITabBarController 内有一个非常基本的 UINavigationController 设置。我想以编程方式布局该导航 Controller 的 rootViewController 的 View ,但是当我查看 viewDidLoad 内的 self.view.frame 时,我得到了这个(例如,在横向中):

1. view frame: {{20, 0}, {748, 1024}} // looks like an odd portrait mode

然后我自动旋转到纵向,我得到了这个:

2. view frame: {{0, 0}, {768, 911}}

然后当我回到横向时,框架现在是这样的:

3. view frame: {{0, 0}, {1024, 655}}

进一步的自旋转事件将在帧值 #2 和 #3 之间翻转。

为了解决 #1 的怪异问题,我目前正在 viewDidLoad 中执行此操作:

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
self.view.frame = CGRectMake(0, 0, 768, 911);
} else {
self.view.frame = CGRectMake(0, 0, 1024, 655);
}

我觉得我显然错过了一些东西。当 View 自动旋转回相同方向时,为什么 View 的默认框架与框架不匹配? View 框架是否未设置为初始方向?很困惑...

我应该提到的是,上述内容(包括我的拙劣的黑客行为)都没有在视觉上改变任何东西。我进行黑客攻击的原因是,当我将 subview 布局到此 View 中时,它们将基于我期望的位置,即导航栏下方的左上角。

我做错了什么?

更新:关闭 View 上的所有自动调整大小的内容会将结果 #1 更改为:

view frame: {{0, 0}, {748, 1024}}

这看起来有点接近,但仍然不匹配#3。

最佳答案

不保证 viewDidLoad 中的框架与最终显示 View 时的框架相同。 UIKit 在显示 View Controller View 之前根据将要出现的上下文来调整它的框架。大小是根据界面方向和任何可见导航栏、选项卡栏、工具栏或状态栏的尺寸(其本身的高度可以更改,例如当您正在打电话时)确定的。

它有助于理解加载和显示 View Controller 的 View 时会发生什么:

  1. 某些东西第一次访问 View Controller 的 view 属性。这可能发生在您自己的代码中,或者发生在 UIKit 中以响应用户操作(例如选择选项卡)。

  2. UIKit 通过调用 loadView(如果已定义)来延迟加载 View Controller 的 View ,或者通过从 initWithNibName:bundle: 中指定的 NIB 加载 View >。如果两者都不存在,UIKit 只会加载一个空 View 。

  3. 一旦 View 及其 subview 完全加载,UIKit 就会调用 viewDidLoad此时, View 的框架将是 NIB 或 loadView 中设置的内容。

  4. 有东西调用 UIKit 来显示 View Controller 的 View 。同样,这可能是用户操作,例如点击选项卡,也可能是代码中的显式方法调用,例如 pushViewController:animated:presentModalViewController:animated:

  5. UIKit 根据 View 呈现的上下文调整 View 大小,如上所述。

  6. UIKit 调用 viewWillAppear:框架现在应该是要显示的尺寸。 (?)编辑:这可能不再正确。请参阅下面的评论。

  7. UIKit 显示带有或不带有动画的 View 。

  8. UIKit 调用 viewDidAppear:

正如您所看到的,如果您需要在呈现 View 框架之前知道 View 框架的大小,viewWillAppear: 是您唯一的机会。请记住,在 View 出现后,此尺寸可能会因各种原因而发生变化,包括旋转事件或状态栏高度的变化。因此,为每个 subview 提供适当的 autoresizingMask 非常重要,以确保布局可以根据边界的任何变化正确调整自身。

如果您希望手动构建 View 层次结构,建议在 loadView 中执行此操作。由于您自己在此方法中构造 View ,因此您可以将其框架初始化为您想要的任何内容。您选择的大小并不重要,因为 UIKit 可能会根据您的情况更改它。只需确保正确设置 autoresizingMasks 即可。

关于iphone - 为什么我必须在 viewDidLoad 中手动设置 View 的框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6757018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com