23

如何始终如一地确定正确的大小以在 loadView 中布局视图?

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

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

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

我在这里看到了一些答案,但没有一个能以一致的方式解决如何做到这一点。

感谢您提供的任何帮助。

4

4 回答 4

16

你不需要知道确切的尺寸。VC 不应该调整自己的规模,这是其母公司的责任。UIView只需按照 Apple UIKit 工程师 Andy Matuschak 在 Twitter上[[UIView alloc] init]的确认创建一个: https ://twitter.com/andy_matuschak/status/365227892151558144

于 2013-09-06T23:26:01.417 回答
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;
}

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

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

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

于 2011-09-20T16:05:50.290 回答
0

“正确”的答案可能是创建一个自定义 UIView 子类,并在您的 layoutSubviews 覆盖中完成所有子视图视图定位。然后,您的子类将被分配给 loadView 中的 self.view。

但是,它也可以使用 viewDidLoad 向 self.view 添加相同大小的子视图。(尽管您应该准备好让这个视图改变大小。——正确设置 autoresizingMasks 可能是一个很好的方法。)

于 2011-11-04T18:13:37.040 回答
-1

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

它以编程方式更改 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.

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

使用 Interface Builder 获取尺寸。

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

于 2011-09-20T14:32:05.157 回答