当前位置:  开发笔记 > 运维 > 正文

直接设置控制器视图和添加视图作为子视图之间的区别

如何解决《直接设置控制器视图和添加视图作为子视图之间的区别》经验,为你挑选了1个好方法。

我刚刚开始学习Objective-C和iphone sdk,我有一个问题,我希望有人可以帮助解释一下.

以下有什么区别:

self.view = someView;

[self.view addSubView: someView];

比如说,在一个简单的应用程序中,我们只有一个控制器和一个容器视图(有一些图像子视图).这两个陈述有什么区别?我问的原因是因为我在一些示例代码中修补了一下,我注意到视图正在用图像初始化为子视图,如下所示:

if (self = [super initWithFrame:CGRectZero])
{
//adds some images as subviews here
}

据我所知,initWithFrame:CGRectZero,创建一个大小为[0,0,0,0]的帧(基本上不可见).

当我直接设置视图时

self.view = someView;

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



1> Brent Royal-..:

你在iPhone屏幕上看到的几乎总是一个视图层次结构.

当您在Mail中查看收件箱时,您会看到一堆视图.这是一个很重要的观点.[1] 在其中,有一个导航栏视图,一个表视图和一个工具栏视图.在导航栏视图中,每侧都有一个按钮视图,中间有一个标签视图.在表视图中,有一堆表格单元格视图,每个单元格都有几个标签视图.工具栏有五个按钮视图.我可以进一步讨论这些按钮内的视图等等,但我相信你明白了.

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

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

在编写视图控制器时,self.view我之前提到过的是根视图; 所有其他视图都是该视图的子视图(或其子视图的子视图等).视图控制器的一个功能是它会自动调整其大小self.view以适应屏幕.(电话中间的可用区域会更小:状态栏的高度是后者的两倍,因此应用程序的空间更小.如果您的视图控制器由导航控制器或选项卡管理,它也会更小吧控制器,但这是一个不同的故事.)但仅仅因为你调整其根视图的大小并不意味着根视图的子视图将自动调整大小.要做到这一点,你需要设置他们的自动调整掩码(一个告诉视图在超级视图改变大小时应该如何反应的属性):

someView.autoresizingMask = UIViewAutoresizingFlexibleWidth
                          | UIViewAutoresizingFlexibleHeight;

(在Interface Builder中设置自动调整遮罩的图形方式 - 单击检查器窗口中的标尺图标,然后查看"自动调整大小"部分.)

但即使这还不够,如果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]我在这里简化了一下,但现在这很好.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有