10

我有一个基于导航的应用程序,我将自定义视图放置在导航视图中。

首先,我想知道如何获取“导航视图”的框架,以便我可以将自定义视图正确放置在上面。
此外,我有时会隐藏导航栏并希望确保正确获取框架信息。(不使用 [[UIScreen mainScreen] bounds] )

其次,一般来说,我如何访问超级视图的框架以便我可以相应地放置视图?
我尝试了以下但没有成功。

-(void) loadView {
[super loadView];
UIView* myView = [[UIView alloc] initWithFrame: CGRectZero];
self.view = myView;
self.view.frame = self.view.superview.frame;
[myView release];
}

或在 layoutSubviews 中设置框架,但注意到 layoutSubviews 没有被调用。我想那是因为我在这个特定视图中没有任何子视图?

谢谢

-编辑-

有了给定的答案,我现在知道我需要将 view.frame 设置为 superview 的边界。
问题是我无法访问 viewDidLoad 中的超级视图。
我可以看到在 viewWillAppear 中正确设置了 superview,但在 viewDidLoad 中却没有。

我发现 viewDidLoad 会在不同的时间被调用,例如当 pushViewController 推送或访问 self.view 时,
我有以下代码,并且 viewDidLoad 是从 nil == controller.view.superview 调用的。

if (nil == controller.view.superview) {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView addSubview:controller.view];
}

由于我无法从 viewDidLoad 访问 superview,因此我无法像之前在 viewDidLoad 中那样布局视图。这似乎很不方便,而且不必要地复杂。
请问有什么建议吗?

4

2 回答 2

10

在您的视图被添加为某处的子视图之前,该superview属性为零。通常,您无法知道loadView方法中的超级视图是什么。

您可以按照 Costique 的建议使用自动调整大小的属性。查看官方 UIView 文档中的调整子视图大小

您还可以在调用 后设置框架loadView,例如:

MyViewController *myController = [[MyViewController alloc] init];
myController.view.frame = window.bounds;
[window addSubview:myController.view];

顺便说一句,bounds子视图的框架使用父属性通常更安全。这是因为父视图的边界与子视图的框架在同一坐标系中,但父视图的框架可能不同。例如:

UIView *parentView = /* set up this view */;
UIView *subView = /* set up subview */;
[parentView addSubview:subView];
parentView.frame = CGRectMake(30, 50, 10, 10);
subView.frame = subView.superview.frame;  // BAD!!!
// Right now subView's offset is (30, 50) within parentView.
subView.frame = subView.superview.bounds;  // Better.
// Now subView is in the same position/size as its parent.
于 2010-11-09T06:14:42.763 回答
7

只需设置自动调整掩码,导航控制器将完成其余工作:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
于 2010-11-09T05:54:44.193 回答