以编程方式创建一个视图,框架设置为superview的框架?

eug*_*ene 10 iphone frame superview

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

首先,我想知道如何获取"导航视图"的框架,以便我可以正确地放置我的自定义视图.
此外,我有时隐藏导航栏,并希望确保我正确获取帧信息.(不是[[UIScreen mainScreen]界限])

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

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

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

谢谢

-编辑-

给定答案,我现在知道我需要将view.frame设置为superview的界限.
问题是我无法访问viewDidLoad中的superview.
我可以看到superview在viewWillAppear中正确设置,但在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];
}
Run Code Online (Sandbox Code Playgroud)

由于我无法从viewDidLoad访问superview,我无法像以前在viewDidLoad中那样布局视图.这看起来很不方便而且不必要地复杂.
有什么建议吗?

Tyl*_*ler 10

superview属性为零,直到您的视图作为子视图添加到某处.通常,您无法知道该loadView方法中的超级视图.

您可以使用Costique建议的自动调整属性.退房调整大小子视图官方的UIView文档.

您也可以在调用后设置帧 loadView,例如:

MyViewController *myController = [[MyViewController alloc] init];
myController.view.frame = window.bounds;
[window addSubview:myController.view];
Run Code Online (Sandbox Code Playgroud)

顺便说一下,将父元素的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.
Run Code Online (Sandbox Code Playgroud)


Cos*_*que 7

只需设置自动调整遮罩,导航控制器将完成剩下的工作:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
Run Code Online (Sandbox Code Playgroud)