在loadView中确定正确的大小

时间:2011-09-20 13:42:42

标签: ios cocoa-touch uiviewcontroller loadview

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

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

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

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

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

感谢您给予的任何帮助。

4 个答案:

答案 0 :(得分:13)

您无需知道确切的尺寸。 VC不应该自己调整大小,这是其父级的责任。只需在Apple UIKit工程师Andy Matuschak在推特上确认UIView[[UIView alloc] init] https://twitter.com/andy_matuschak/status/365227892151558144

答案 1 :(得分:12)

- (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对象,您定义的自定义视图或可以缩放以填充的任何其他视图   屏幕。
  2.   

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

答案 2 :(得分:0)

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

但是,它也可以使用viewDidLoad向self.view添加相同大小的子视图。 (虽然你应该为这个视图做好准备来改变大小。 - 正确设置autoresizingMasks可能是一个很好的方法。)

答案 3 :(得分:-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中的尺寸,请选择视图,选择属性检查器,禁用状态栏,现在在大小检查器中,您可以调整视图大小,重新排列子视图,并记下要放置的数字在你的代码中。