Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 直接设置控制器和#x27;s视图并将视图添加为子视图_Iphone - Fatal编程技术网

Iphone 直接设置控制器和#x27;s视图并将视图添加为子视图

Iphone 直接设置控制器和#x27;s视图并将视图添加为子视图,iphone,Iphone,我刚刚开始学习objective-C和iphone sdk,我有一个问题,希望有人能帮我解释一下 以下方面的区别是什么: self.view = someView; 及 例如,在一个简单的应用程序中,我们只有一个控制器和一个容器视图(有几个图像子视图)。 这两种说法的区别是什么?我问这个问题的原因是因为我在修改一些示例代码,我注意到视图是以图像作为子视图初始化的,如下所示: if (self = [super initWithFrame:CGRectZero]) { //adds some i

我刚刚开始学习objective-C和iphone sdk,我有一个问题,希望有人能帮我解释一下

以下方面的区别是什么:

self.view = someView;

例如,在一个简单的应用程序中,我们只有一个控制器和一个容器视图(有几个图像子视图)。 这两种说法的区别是什么?我问这个问题的原因是因为我在修改一些示例代码,我注意到视图是以图像作为子视图初始化的,如下所示:

if (self = [super initWithFrame:CGRectZero])
{
//adds some images as subviews here
}
据我所知,initWithFrame:CGRectZero创建了一个大小为[0,0,0,0](基本上不可见)的帧

当我直接用

self.view = someView;

我注意到视图实际上显示了图像。但是,当我将视图作为控制器“默认”视图的子视图添加到时,它不会。所以基本上我的问题是,幕后发生了什么?为什么第一种方法“调整”帧的大小,而第二种方法没有做相同的事情。

设置视图控制器的“视图”属性只会更改它正在管理的视图

将一个视图添加为另一个视图的子视图,实际上会将该子视图添加到另一个视图下面

它们是非常不同的事情,一个调整视图控制器,另一个改变视图层次


据猜测,第一种方式看不到任何内容的原因是您正在添加的子视图的帧是CGRectZero(大小为0)。

当您将视图添加为子视图时,您需要确保您实际上正在添加到现有视图

self.view=view
设置控制器的视图。如果没有这一点(无论是在代码中还是用XIB完成),您将永远看不到任何东西,因为控制器没有要显示的视图

[self.view addSubView:someView]
假设self.view已设置。如果没有,您将添加
someview
作为
nil
的子视图,并且它将永远不会被看到

基本上,将
self.view
视为一个大容器,所有子视图都只是其中的一部分。如果不需要任何子视图,可以将
self.view
设置为UIImageView或UIWebView。如果确实需要子视图,则需要一个大的空容器视图来放置它们


在您的情况下,我打赌
self.view
从未设置,您将图像视图添加到
nil
您在iPhone屏幕上看到的几乎总是视图的层次结构

比如说,当你查看邮件中的收件箱时,你会看到一堆视图。其中有一个大的包含视图。[1]其中有一个导航栏视图、一个表视图和一个工具栏视图。在导航栏视图中,每一侧都有一个按钮视图,中间有一个标签视图。在表视图中,有一组表单元格视图,每个单元格都有几个标签视图。工具栏有五个按钮视图。我可以进一步讨论这些按钮内部的视图等等,但我相信你会明白的

任何给定视图上方的视图都是其超视图;它下面的视图是它的子视图。因此,一个表单元视图有一个表视图作为其超级视图,有一组标签视图作为其子视图。俯视图(其中包含所有其他视图)称为根视图

每个视图都有自己的图形表面。由该绘图面形成的矩形称为框架。视图的框架相对于其包含视图的框架。因此,如果我们的一个表格单元格的标签子视图的帧位于(0,0),这意味着它将位于表格单元格的左上角,即使单元格位于屏幕的一半

在编写视图控制器时,
self.view
就是我前面提到的根视图;所有其他视图都是该视图的子视图(或其子视图的子视图,等等)。视图控制器的一个功能是自动调整其
self.view
的大小以适应屏幕。(可用的区域在电话呼叫中间会变小:状态栏是当时的两倍,所以你的应用程序占用的空间更少。如果你的视图控制器是由导航控制器或标签栏控制器管理的,那么它也会更小,但这是另一回事。)但是,调整其根视图的大小并不意味着根视图的子视图将自动调整大小。要做到这一点,您需要设置它们的自动调整大小掩码(一个告诉视图在其superview更改大小时应如何反应的属性):

(有一种在Interface Builder中设置自动调整大小掩码的图形方法,单击inspector窗口中的标尺图标,然后查看“自动调整大小”部分。)

尽管如此,如果
someView
的大小不合适,那么这还不够。为此,在将其添加为
self.view
的子视图之前,请调整其框架:

someView.frame = CGRectMake(
                            0, // all the way to the left
                            0, // all the way at the top
                            self.view.frame.size.width, // same width as the root view
                            self.view.frame.size.height, // same height too
                           );
那么,如果您必须执行根视图为您所做的所有操作,为什么还要使用子视图呢?简单:您只能有一个根视图,但一个视图几乎永远不足以满足您的需要。如果您真的只需要一个视图,当然,您可以将其设置为根视图,然后继续您的快乐之路,但情况可能比这更复杂


[1] 我在这里简化了一点,但现在就可以了。

我也想到了这一点,但我的理解是,当您初始化UIViewController时,会自动创建一个视图-我知道UITableViewController就是这样。是的,这也是我所理解的。因此self.view(如果为nil)将调用loadView,默认的loadView将创建一个视图。如果不使用XIB,则需要自己创建该视图。您可以在loadView中执行此操作。
someView.autoresizingMask = UIViewAutoresizingFlexibleWidth
                          | UIViewAutoresizingFlexibleHeight;
someView.frame = CGRectMake(
                            0, // all the way to the left
                            0, // all the way at the top
                            self.view.frame.size.width, // same width as the root view
                            self.view.frame.size.height, // same height too
                           );