我有一个超级视图,可以添加两个子视图(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的底部对齐,并且具有Superview的整个宽度,所以这很好。但是高度很奇怪...当第一次绘制/显示的subview2的高度非常有限时,似乎在20到30像素之间,但是我可以通过切换到另一个选项卡/视图然后返回来强制重新绘制,然后将其完整绘制/正确的高度。我的subview2是一个NSTextView,当我输入文本时发生奇怪的事情,我的subview2突然无法占据所有高度,并且不再与Superview的底部对齐。

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

谢谢
索伦

最佳答案

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

您应该将两个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]];


如果文本视图内部是否包含内容,其行为方式可能会有所不同,则可能与文本视图的固有大小有关。或者,超级视图本身可能正在改变其大小-超级视图受到哪些约束?您将需要设置一些边框/背景色或使用自省工具来确定哪些帧变得有趣。

关于xcode - 我如何使用NSLayoutConstraint使 subview 占用Superview的剩余/总高度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19360092/

10-10 21:09