在loadView中确定正确的大小

Ric*_*kiG 20 cocoa-touch uiviewcontroller loadview ios

如何在loadView中一致地确定正确的大小来布局视图?

我有不同的情况,其中UIViewController被推送到UINavigationController,或UITabBarController存在,或两者兼而有之.如果我硬编码值,这些元素会更改可用的屏幕区域并使其不一致.

在调用loadView的那一刻,我想知道如何调整容器视图的大小,我将我的子视图添加到.

我查看了UIViewController指南,Apple使用了UIScreen mainScreen applicationFrame,但在他们的示例中,这是因为他们正在制作一个全屏应用程序.

我在这里看到了一些答案,但没有一个能够以一致的方式解决这个问题.

谢谢你给予的任何帮助.

Jav*_*oto 15

您无需知道确切的大小.VC不应该自己调整大小,这是其父级的责任.只要创建一个UIView具有[[UIView alloc] init]为在Twitter上证实了苹果的UIKit工程师安迪Matuschak:https://twitter.com/andy_matuschak/status/365227892151558144

  • 这是正确的,我之前的回答(现已删除)实际上是错误的.你也可以使用`self.view = [[UIView alloc] initWithFrame:CGRectZero];`.并且不要忘记设置`self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;`如果你不使用AutoLayout. (2认同)

ban*_*isa 13

- (void) loadView {
     //self.wantsFullScreenLayout = YES; //could add this for translucent status bars
     UIView *view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
     self.view = view;
}
Run Code Online (Sandbox Code Playgroud)

从Apple的View Controller Programming Guide以编程方式创建视图:

  1. 创建一个大小适合屏幕的根视图对象.根视图充当与视图控制器关联的所有其他视图的容器.您通常会为此视图定义框架以匹配应用程序窗口的大小,应用程序窗口本身应填充屏幕.但是,视图控制器还会根据需要调整帧大小以适应各种视图的存在,例如系统状态栏,导航栏或标签栏.您可以使用通用UIView对象,您定义的自定义视图,或任何其他可以缩放以填充屏幕的视图.

然后它有一个类似于我上面写的那个例子.

  • viewController在loadView中没有视图属性 - 如果我调用[super loadView]我会得到一个,但我的想法是自己创建. (2认同)

Bil*_*son -1

我制作了一个应用程序,它加载几个 UITextViews、UIButtons 和一个 UISegment 控件。我在 viewWillAppear 中所做的,称为我所做的调整大小方法。

它以编程方式更改 UIViewController 中所有子视图的大小。这是因为 IB 中的自动调整大小效果就这么好。

在我的 calcViewSize 函数中,我得到这样的尺寸;

CGFloat width = [[UIScreen mainScreen] applicationFrame].size.width;
CGFloat height = self.view.frame.size.height; //this will retrieve the frame we are drawn into.
Run Code Online (Sandbox Code Playgroud)

然后我遍历 UIViewController 中要调整大小的每个子视图,并更改其框架。我在 IBOutlet 中有这些视图的属性,因此我已经知道这些视图是什么。

使用 Interface Builder 获取尺寸。

最后一点注意:要更改 IB 中的尺寸,请选择视图,选择属性检查器,禁用状态栏,现在在尺寸检查器中,您可以调整视图大小,重新排列子视图,并记下要放入代码中的数字。