gpt4 book ai didi

xcode - 如何使用 NSLayoutConstraint 使 subview 占据 super View 的剩余/总高度

转载 作者:行者123 更新时间:2023-12-03 17:12:20 25 4
gpt4 key购买 nike

我有一个 super View ,我在其中添加两个 subview (subview1 和 subview2)。

我希望 subview1 与 superview 具有相同的宽度并与 superview 一起拉伸(stretch),并且高度为 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 一起拉伸(stretch),并且我希望 subview2 将其顶部与 subview1 的底部对齐,然后我希望 subview2 填充 superview 的所有剩余高度(将底部对齐)并通过 superview 拉伸(stretch)高度。我尝试用这段代码来做到这一点:

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];

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

希望我的解释可以,如果不行请提问。有想法该怎么解决这个吗?我以为|-0-[查看]-0-|会成功吗?

谢谢
索伦

最佳答案

从您的问题中不清楚您是否正在运行所有这些代码,或者第一个代码段仅适用于一个 View ,第二个代码段适用于两个 View 。

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

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

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]];

如果 TextView 在内部有内容或没有内容时表现不同,您可能会遇到一些与 TextView 的固有大小有关的问题。或者, super View 本身可能正在改变其大小 - super View 有哪些限制?您将需要设置一些边框/背景颜色或使用内省(introspection)工具来确定哪些框架变得有趣。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com