Xcode 从代码中添加NSLayoutConstraint

Xcode 从代码中添加NSLayoutConstraint,xcode,cocoa,Xcode,Cocoa,我在理解代码中的约束时遇到了很多问题。我有一个在IB中创建和设置的容器视图,然后在该容器NSView的initWithFrame中添加子NSView,如下所示(self是容器视图): 现在的问题是子视图根本不可见,我不知道它会发生什么。我想做的是让子视图始终使其顶部正好位于容器视图的顶部,左视图和右视图也是如此,因此子视图必须具有固定的高度,但始终位于容器视图的顶部,然后延伸到容器视图的侧面(如所附图像所示) 这是如何从代码中实现的 谢谢你 瑟伦这里有几个问题 首先,您使用的是initWith

我在理解代码中的约束时遇到了很多问题。我有一个在IB中创建和设置的容器视图,然后在该容器NSView的initWithFrame中添加子NSView,如下所示(self是容器视图):

现在的问题是子视图根本不可见,我不知道它会发生什么。我想做的是让子视图始终使其顶部正好位于容器视图的顶部,左视图和右视图也是如此,因此子视图必须具有固定的高度,但始终位于容器视图的顶部,然后延伸到容器视图的侧面(如所附图像所示)

这是如何从代码中实现的

谢谢你

瑟伦这里有几个问题

首先,您使用的是
initWithFrame:
,然后启用自动布局-这意味着您的帧信息将被丢弃。您的子视图需要一个高度约束

其次,将约束添加到子视图而不是其超级视图。autolayout系统可能能够解决这一问题,但在这种情况下,应该将约束添加到
self

您可以在调试器或像Reveal这样的自省工具中检查视图的框架,看看哪里出了问题-我猜在这种情况下,您的子视图的高度为零

第三(这不一定是个问题),您正在使用的代码是不必要的冗长。单独创建格式有助于理解正在创建的约束,也有助于复杂的跨层次约束,但它可能会导致布局不明确或向错误视图添加约束。您所追求的布局非常适合使用视觉格式语言-它只有两条语句:

对于您的水平布局:

@"|[childView]|"
对于垂直布局:

@"V:|[childView(==height)]"
其中,
height
是度量词典中的一个键,或者用硬编码的高度编号替换它


我已经详细介绍了在代码中创建约束的各种方法:和。这两个框架都以iOS为中心,但autolayout在这两个框架上非常相似

哪个视图是tabContainerView?在上面我们可以看到的代码上下文中,
self
是什么?是的,很抱歉-我已将tabContainerView重命名为childView(它是子视图),而self是容器视图您在上一个[self addSubview:childView]中尝试了这一行吗;尽管是第三行。我一直在寻找一个关于这个的好教程,你的教程非常棒,谢谢!
@"V:|[childView(==height)]"