Iphone 以编程方式创建视图,并将框架设置为superview';什么样的框架?

Iphone 以编程方式创建视图,并将框架设置为superview';什么样的框架?,iphone,frame,superview,Iphone,Frame,Superview,我有一个基于导航的应用程序,我将自定义视图放在导航视图中 首先,我想知道如何获取“导航视图”的框架,以便将自定义视图正确放置在其上。 此外,我有时会隐藏导航栏,以确保获得正确的帧信息。(不带[[UIScreen mainScreen]边界]) 其次,一般来说,如何访问superview的框架,以便相应地放置视图? 我尝试了下列方法,但没有成功 -(void) loadView { [super loadView]; UIView* myView = [[UIView alloc] initWit

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

首先,我想知道如何获取“导航视图”的框架,以便将自定义视图正确放置在其上。
此外,我有时会隐藏导航栏,以确保获得正确的帧信息。(不带[[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];
}
或者在LayoutSubview中设置框架,但注意到LayoutSubview没有被调用。我想这是因为我在这个特定的视图中没有任何子视图

多谢各位

-编辑-

根据给定的答案,我现在知道需要将view.frame设置为superview的边界。
问题是我无法访问viewDidLoad内部的superview。
我可以看到superview在ViewWillDisplay中设置正确,但在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中那样布局视图。这似乎很不方便,也不必要地复杂。

有什么建议吗?

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

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

在将视图作为子视图添加到某个位置之前,
superview
属性为零。通常,您无法知道
loadView
方法中的superview是什么

您可以使用Costique建议的自动调整大小属性。查看中的调整大小子视图

您还可以在调用
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.

您需要阅读iOS中的视图层次结构。啊,谢谢,我想它会正常工作。但我有一个滚动视图作为我的视图之一。我想将autoresizingMask设置为scrollview不起作用?为什么不呢?UIScrollView只是一个专门的UIView,它操纵其边界原点以进行滚动。唯一不同的是,我使用[UIScreen mainScreen].applicationFrame而不是CGRectZero初始化UIView,但我认为这一点都不重要。我已经尝试了你的建议。但是在我的viewDidLoad()中,[self.view bounds](到布局子视图)返回(0,0,0)。我在什么地方搞砸了吗?在viewDidLoad中是否获得了正确的[self.view bounds]?如果我没有记错的话,viewDidLoad在视图添加到导航控制器的视图层次结构之前发送,紧跟在loadView之后。应在发送ViewDidDisplay:时将其添加到superview中。因此,如果您需要计算一些几何图形,Apple建议您将初始图幅设置为[UIScreen mainScreen].applicationFrame。顺便说一下,如果设置了view属性,就不应该发送[super loadView];在我的viewDidLoad()中。但我注意到我正在loadView中创建视图,但实际上我还没有通过addSubview或其他方式将其添加到superview中。所以代码没有任何作用。奇怪的是,我以前没有将视图添加到父视图中就可以看到它。如何将我的视图(在loadView中创建)添加到父视图?很抱歉,我读错了自己的代码。我猜它是在使用UINavigationController的rootviewcontroller初始化时添加的