gpt4 book ai didi

ios - 正确的 loadView 实现

转载 作者:技术小花猫 更新时间:2023-10-29 10:14:34 25 4
gpt4 key购买 nike

Apple 的文档没有说明 loadView 的正确实现方式。

我发现如果你像这样实现 loadView:

- (void)loadView
{
self.view = [[UIView alloc] init];
}

...然后你会得到与根本不实现它不同的行为。特别是,在一个 20 行的项目中,我发现调用 viewWillAppear 时使用了 self.view 的零大小框架 - 除非您使用 Apple 的默认版本的 loadView。

在 Google 上,有很多提供明显错误的 loadView 实现的“教程”——例如强制将大小设置为 (320,480),因为教程作者“发现如果我这样做它会起作用”。

我想知道正确的实现应该是什么。

注意:在我上面的示例中,我将它添加到 AppDelegate 内的 View 层次结构中,如下所示:

[self.window addSubview:(UIViewController*).view];

我相信,在存在 UINavigationController 或 UITabBarController 的情况下,Apple 会做一些额外的魔法——作为副作用——导致单行 loadView 实现正常工作。但我想正确地编写它,以便它总是有效!

注意:我已经尝试在 Root View 上设置自动调整掩码,但它不会改变发生的事情:

- (void)loadView
{
self.view = [[UIView alloc] init];
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

最佳答案

-loadView 的默认实现创建 View 或加载 NIB。据我所知,在 -loadView 中无法知道创建时 View 的最终大小。因此默认 View 大小设置为 UIScreen.mainScreen.bounds。这是因为在 -viewDidLoad 和其他方法中可能难以使用零帧 View 。

您的单行实现可能如下所示:

- (void)loadView {
self.view = [[UIView alloc] initWithFrame:UIScreen.mainScreen.bounds];
}

您不需要设置自动调整掩码,因为您不知道 View 将在什么上下文中显示。调用者负责为您设置正确的框架、自动调整掩码和类似属性。

UINavigationController 方法中想象一下:

// we are pushing new VC, view is accessed for the first time
pushedVC.view.frame = CGRectMake(...);

它正在设置正确的框架,但是您的 -loadView 只是在 之前 -setFrame: 被调用。所以在 -viewDidLoad 期间你有临时的非零帧,只是为了能够设置 subview 和内部自动调整大小。在此之后,为您设置了正确的框架,并且在 -viewWillAppear: 中您有最终框架。

关于ios - 正确的 loadView 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803931/

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