0

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

childView = [[NSView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, tabContainerHeight + tabContainerTopSpace)];
[childView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:childView];

NSLayoutConstraint *tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

现在的问题是子视图根本不可见,我不知道它会发生什么。我想要做的是让子视图的顶部始终恰好位于容器视图的顶部,左右两侧也是如此,因此子视图必须具有固定的高度,但始终位于容器视图的顶部然后使用容器视图拉伸到两侧(如附件图像中的解释)。

在此处输入图像描述

这是如何从代码中完成的?


谢谢索伦_

4

1 回答 1

0

这里有几个问题。

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

其次,您将约束添加到子视图而不是其父视图。自动布局系统可能能够解决这个问题,但self在这种情况下确实应该添加约束。

您可以在调试器或诸如 Reveal 之类的内省工具中检查视图的框架,以查看可能出现问题的地方 - 我猜在这种情况下,您的子视图中的高度为零。

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

对于您的水平布局:

@"|[childView]|"

对于您的垂直布局:

@"V:|[childView(==height)]"

您的指标字典中的键在哪里height,或者您将其替换为硬编码的高度数。

我已经详细介绍了在代码中创建约束的各种方法:视觉格式语言单个约束。这些都是针对 iOS 的,但自动布局在两个框架上非常相似。

于 2013-10-07T14:24:09.487 回答