view.frame.width在带故事板的viewDidLoad中是正确的,为什么?

ull*_*trm 5 ios

好的,这有点奇怪。我已经开发iOS应用程序已有一段时间了,并且一直认为这viewDidLoad是使用视图框架的不正确地方。

但是,在我要解决一些错误的一个应用程序中,似乎实际上已正确设置了框架viewDidLoad

情节提要使用的是“ View as:iPhone 7”,因此我希望该框架的宽度为375px viewDidLoad。我使用的是普通的推播功能。

但是,宽度实际上已正确设置为当前设备的屏幕宽度。我正在使用模拟器。

我想念什么?viewDidLoad如今我们可以使用宽度进行计算吗?

Poc*_*chi 7

不,您仍然不能viewDidLoad用于任何与尺寸/位置相关的东西。

第一种具有实际“适当”尺寸的方法是viewDidLayoutSubviews.

关于你正在经历的现象。

您可能正在谈论视图控制器中的“根视图”。

正如苹果文档所说(粗体是我的):

视图控制器的根视图的大小总是适合其分配的空间。对于视图层次结构中的其他视图,请使用 Interface Builder 指定自动布局约束,这些约束控制每个视图在其超视图边界内的定位和大小。您还可以以编程方式创建约束并在适当的时候将它们添加到您的视图中。有关如何创建约束的更多信息,请参阅自动布局指南。

https://developer.apple.com/documentation/uikit/uiviewcontroller

这就是您获得正确宽度的原因。


如果您想进行测试,请尝试添加一个填充整个“根视图”区域的子视图。这个可能只是给你显示在界面生成器上的尺寸。

我的测试结果:

界面生成器 ->“以 iPhone 7 方式查看”

模拟器 iPhone 5s:

Root View dimensions: (0.0, 0.0, 320.0, 568.0)
Sub View dimensions: (0.0, 0.0, 375.0, 667.0)
Run Code Online (Sandbox Code Playgroud)

模拟器 iPhone 7:

Root View dimensions: (0.0, 0.0, 375.0, 667.0)
Sub View dimensions: (0.0, 0.0, 375.0, 667.0)
Run Code Online (Sandbox Code Playgroud)

模拟器 iPhone 7 Plus:

Root View dimensions: (0.0, 0.0, 414.0, 736.0)
Sub View dimensions: (0.0, 0.0, 375.0, 667.0)
Run Code Online (Sandbox Code Playgroud)

界面生成器 -> “以 iPhone 4s 的方式查看”

模拟器 iPhone 5s:

Root View dimensions: (0.0, 0.0, 320.0, 568.0)
Sub View dimensions: (0.0, 0.0, 320.0, 480.0)
Run Code Online (Sandbox Code Playgroud)

模拟器 iPhone 7:

Root View dimensions: (0.0, 0.0, 375.0, 667.0)
Sub View dimensions: (0.0, 0.0, 320.0, 480.0)
Run Code Online (Sandbox Code Playgroud)

模拟器 iPhone 7 Plus:

Root View dimensions: (0.0, 0.0, 414.0, 736.0)
Sub View dimensions: (0.0, 0.0, 320.0, 480.0)
Run Code Online (Sandbox Code Playgroud)

如您所见,根视图尺寸将始终与文档中所述的您使用的设备相对应。而任何其他视图将具有您可以在界面构建器上看到的尺寸。


这个问题还将帮助您了解生命周期的工作原理: 为什么我必须在 viewDidLoad 中手动设置视图的框架?