UIViewController或UINavigationController是否设置它们的视图大小?

5
我有几个UIViewControllers,通过UINavigationController加载,我重写了loadView,并设置了自定义视图进行显示。我在设置某些子视图的框架时遇到了问题,也许是视图本身。我认为,无论是UINavigationController还是UIViewController,在显示时都能够强制将其视图填充屏幕。
我想知道视图的大小是否被设置了,如果被设置了,是以何种方式设置的,是通过设置视图的框架还是其他方式。
谢谢。
更新: 当我通过以下loadView方法创建新的UINavigationController时,我刚刚注意到:
- (void)loadView
{
  UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 10.0f, 10.0f)];
  [view setBackgroundColor:[UIColor redColor]];
  self.view = view;
  [view release];
}

我的视图占据整个屏幕,除了状态栏和标题栏外都是红色的。在什么时候会调整我的视图大小以填满整个屏幕?创建视图时应该使用什么尺寸?

2个回答

9

当使用UINavigationController进行页面跳转时,它会自动调整被推送的ViewController的视图大小。根据文档:

pushViewController:animated:

viewController参数中的对象将成为导航堆栈中的顶部视图控制器。推送一个视图控制器将显示它管理的视图。如何显示该视图取决于animated参数。如果animated参数为YES,则视图会以动画方式移动到指定位置;否则,视图只是简单地显示在原位。在显示之前,视图会自动调整大小以适应导航栏和工具栏之间(如果存在)。

如果您想要显示较小的视图,则需要创建一个容器并将其设置为您的VC视图的子视图,并手动设置大小。根据您创建视图的方式,可能需要正确设置自动调整掩码。


谢谢,这一定是我曾经阅读过但忘记了具体内容/位置的文档。 - Ryan
2
有没有办法在 push 操作后强制导航控制器重新调整其子视图控制器的大小?我正在更改导航控制器的高度,但由于某种原因它并没有自动调整其内容。 - devios1
我还发现一个问题,当你在转场期间旋转设备时,导航控制器没有调整其子视图控制器的大小。 - AdamPro13

3

UIViewControllers的框架变小了,因为UINavigationController通过添加一个大小为44.0f的UINavigationBar来操作视图。

它会被重新调整大小,因为您使用self.view = view;替换了视图。如果您使用addSubview:而不是替换视图,则它将保持原始大小。logancautrell解释了何时以及为什么要这样做。


谢谢澄清。当通过UINavigationController推送时,在视图控制器的loadView中加载我的视图,我只需要将frame设置为CGRectMake(0.0, 0.0, 320.0, 416.0)吗?也就是说,我不需要在frame原点y坐标上为UINavigationBar或状态栏进行补偿吗? - Ryan
NavBar底部成为视图控制器的新X,Y原点,您只需要补偿调整后的高度。为确保尺寸,请使用NSLog(@"w x h = %f x %f",self.view.frame.size.width, self.view.frame.size.height); - Wolfert
谢谢,这让我明白了。我仍然想知道视图何时会发生变化。因为即使我在loadView中设置了错误的大小,它也会被更改为正确的大小。我会接受你的答案,因为它让我有所进展。再次感谢。 - Ryan
它在这里被重新调整大小:self.view = view; - Wolfert
如果您使用以下语句:[self.view addSubview:view]; 它将不会调整大小。 - Wolfert
我对UIView进行了子类化,并在设置frame时记录了日志。它不是在self.view上设置的,而是在UIViewController的viewDidLoad之后的某个时间设置的。但你基本上是正确的。感谢@logancautrell的澄清。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接