在Cocoa View Hierarchy中,什么决定了subView的位置?

时间:2013-02-11 07:22:20

标签: objective-c macos cocoa

我是来自Java / C#和C / C ++的cocoa / objective-C的新手。可可一直给我带来很多麻烦。我在可可中读过一篇关于View层次结构的苹果文章。但仍然存在困惑。

我需要知道何时以编程方式向视图添加子视图而不是通过界面构建​​器。假设在同一父视图中有其他子视图,视图的确切位置将相对于其他子视图。

在java中有布局管理器,在C#中还有垂直/水平面板等,所以我们知道如果我添加一个项目/控件它将会到达现有项目的右侧或者它的底部。 / p>

因此,如果我按照以下行所示,确切地确定了新子视图的放置位置?

    [[window contentView] addSubview:newView];

谢谢,

5 个答案:

答案 0 :(得分:3)

视图的框架定义了它在超视图坐标中占据的矩形,因此它的位置将为frame.origin。这可以在添加子视图之前或之后设置。

View Programming Guide中明确说明了这一点。

答案 1 :(得分:2)

这取决于您是否使用Autolayout。

如果不是,则在创建视图时调用 - [NSView initWithFrame:(NSRect)frame],该帧将定义视图在superview坐标中的显示位置。

_view = [[NSTextField alloc] initWithFrame:NSMakeRect (50, 50, 100, 50)];

将使NSTextField大小为100x50,它将在superview中放置50,50像素。

如果您使用的是Autolayout,那么视图的位置完全取决于适用于它的布局约束。使用Autolayout时,您设置的任何帧都将被忽略。虽然自动布局具有陡峭的学习曲线,但一旦设置了约束,它(理论上)意味着您可以忽略布局。

答案 2 :(得分:1)

frame矩形在超视图中显示视图的大小和位置。框架位于0,0(x,y)位置,默认大小为0,0(w,h)。除非在极少数情况下(例如NSSplitView),否则子视图集合中的位置将被完全忽略。

答案 3 :(得分:1)

Cocoa不会自动对齐任何视图。没有像.net或java那样的初始布局机制 您必须通过以点为单位设置框架来手动定位所有视图 默认情况下,新初始化视图的原点位于(0,0)。

答案 4 :(得分:0)

AFAIK,文档和头文件没有准确指定添加的子视图将被放置的原点(x,y)。添加子视图后我要做的是在使用CGRectMake()重新定位子视图之前计算新的原点(如果适用)大小。