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

标签 xcode cocoa

我有一个 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/

相关文章:

c++ - 错误 : "Attempt to use a deleted function" when moving a promise

iphone - 如何将 MWPhotoBrowser 与我现有的 StoryBoard 集成

cocoa - Mac 开发中菜单栏应用程序的窗口管理如何工作?

objective-c - 沙盒 Mac 应用程序可以在哪里保存文件?

cocoa - NSButton 上的简单鼠标悬停效果

objective-c - 除了 NSObject 上的类别之外,在两个类之间共享一组方法的更好方法是什么?

iphone - 在 UITableViewCell 和 UITableViewController 之间传递数据?

ios - 如何从命令行安装 iOS 模拟器

iphone - 表格 View 占据了整个 View 而不是输入的宽度和高度

cocoa - 如何使我的 Cocoa 应用程序针对基于 Intel 的 Mac 和旧 PPC 系统?