1

我有一个超级视图,我添加了两个子视图(subview1 和 subview2)。

我希望 subview1 与 superview 具有相同的宽度并使用 superview 进行拉伸,并且还具有 30px 的高度并与 superview 的顶部对齐。我可以使用以下代码:

NSDictionary *metrics = @{@"height":[NSNumber numberWithFloat:30.0f]};
NSDictionary *views = NSDictionaryOfVariableBindings(subview1);
NSArray *tabContainerConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subview1(==height)]" options:NSLayoutFormatAlignAllTop metrics:metrics views:views];
[superview addConstraints:tabContainerConstraints];

metrics = nil;
tabContainerConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[subview1]|" options:(NSLayoutFormatAlignAllLeading | NSLayoutFormatAlignAllTrailing) metrics:metrics views:views];
[superview addConstraints:tabContainerConstraints];

然后我希望 subview2 也具有与 superview 相同的宽度并使用 superview 拉伸,并且我希望 subview2 将其顶部与 subview1 的底部对齐,然后我希望 subview2 填充 superview 的所有剩余高度(对齐底部到底部)并拉伸高度与superview。我尝试使用以下代码执行此操作:

NSDictionary *metrics = nil;
NSDictionary *views = NSDictionaryOfVariableBindings(subview2);
NSArray *tabContainerConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[subview2]|" options:(NSLayoutFormatAlignAllLeading | NSLayoutFormatAlignAllTrailing) metrics:metrics views:views];
[superview addConstraints:tabContainerConstraints];

views = NSDictionaryOfVariableBindings(subview1, subview2);
tabContainerConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[subview1][subview2]-0-|" options:0 metrics:metrics views:views];
[superview addConstraints:tabContainerConstraints];

但是奇怪的事情发生了......子视图始终与其顶部对齐到 subview1 的底部,并且还具有超级视图的完整宽度,所以这很好。但是高度很奇怪......当第一次绘制/显示的 subview2 的高度非常有限时,似乎在 20-30 像素之间,但我可以通过切换到另一个选项卡/视图并返回来强制重绘,然后将其全部绘制/正确的高度。我的 subview2 是一个 NSTextView,当我输入文本时发生奇怪的事情,我的 subview2 突然没有占据所有高度并且不再与 superview 的底部对齐。

我希望我的解释是好的,如果不是,请提出任何问题。有想法该怎么解决这个吗?我以为 |-0-[视图]-0-| 会成功吗?


谢谢索伦_

4

1 回答 1

1

从您的问题中不清楚您是在运行所有代码还是第一个片段仅用于一个视图,而第二个片段用于两个视图。

您应该将两个 VFL 字符串合并为一个,并且不需要您提供的某些布局选项。如果 VFL 字符串中只有一个视图,则布局选项毫无意义。

我建议使用以下代码来创建您的约束:

NSDictionary *metrics = @{@"height":[NSNumber numberWithFloat:30.0f]};
NSDictionary *views = NSDictionaryOfVariableBindings(subview1,subview2);

// Horizontal layout for subview 1
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[subview1]|" options:0 metrics:metrics views:views]];

// Vertical layout - the options here mean that subview2 will be the same width as subview1
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subview1(==height)][subview2]|" options:NSLayoutFormatAlignAllLeft | NSLayoutFormatAlignAllRight metrics:metrics views:views]];

您可能对文本视图的固有大小有一些问题,如果它在里面有内容时表现不同的话。或者,超级视图本身可能正在改变它的大小——超级视图的约束是什么?您将需要设置一些边框/背景颜色或使用自省工具来确定哪些帧变得有趣。

于 2013-10-15T08:37:06.107 回答