constraintsWithVisualFormat 为所有视图设置相同的 Y 位置
Posted
技术标签:
【中文标题】constraintsWithVisualFormat 为所有视图设置相同的 Y 位置【英文标题】:constraintsWithVisualFormat set same Y position for all the views 【发布时间】:2014-10-01 06:16:42 【问题描述】:我只是在玩constraintsWithVisualFormat
,但不知道该怎么做。
我有两个视图放在一起,水平边距为 10 像素。两个视图的 Y 位置相同。
我尝试了以下方法。
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view1(==100)]-10-[view2(==100)]" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[view1(==100)]-[view2(==100)]" options:0 metrics:nil views:views]];
水平约束:距超级视图 10 像素左边距 - 100 宽度 view1 的 10 像素边距 - view2 的 100 宽度
垂直约束:距超级视图 10 像素顶部 - 视图 1 的 100 高度 - 100 高度的 view2
问题 第二个视图 Y 位置在 view1 之后开始,我希望两个视图的 Y 位置相同。
如果可能,请解释答案
【问题讨论】:
【参考方案1】:Mark '-' 是 VisualFormatLanguage 中 8px 的边距。
试试这个。
`[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view1(==100)]-10-[view2(==100)]" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[view1(==100)]" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[view2(==100)]" options:0 metrics:nil views:views]];`
【讨论】:
是的,明白了.. V:|-10-[view1(==100)]] 中多了一个括号,所以改一下 标记'-'不是8px,它是一些默认值,取决于视图类和其他属性。请注意,无法使用 [NSLyaoutConstraint initWith...] 手动创建“-”,只能通过 VFL。【参考方案2】:水平布局,底部对齐:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view1(==100)]-10-[view2(==100)]"
options:NSLayoutFormatAlignAllBottom
metrics:nil
views:views]
垂直布局不变:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[view1]"
options:0
metrics:nil
views:views]
另请注意,两种方法 - 将每个视图约束在超级视图的顶部与围绕公共顶部/底部/基线/中心对齐所有视图明显不同。顺便说一句,其他答案无法解决中心对齐的情况。
UPD:这是在布局中使用对齐选项的完整工作示例:
- (void)applicationDidFinishLaunching:(NSNotification *)notification
NSTextField *view1 = [[NSTextField alloc] initWithFrame:NSZeroRect];
NSTextField *view2 = [[NSTextField alloc] initWithFrame:NSZeroRect];
NSView *contentView = [self.window contentView];
NSDictionary *views = NSDictionaryOfVariableBindings(view1, view2);
[view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[view2 setTranslatesAutoresizingMaskIntoConstraints:NO];
[contentView addSubview:view1];
[contentView addSubview:view2];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view1(==100)]-[view2(==100)]"
options:NSLayoutFormatAlignAllBottom
metrics:nil
views:views]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view1]"
options:0
metrics:nil
views:views]];
【讨论】:
不,view2的Y位置没有约束 NSLayoutFormatAlignAllBottom 正是为此。添加了一些描述。 @SidShah 我之前没有测试过,但它无需更改即可工作。两个文本编辑一个接一个 [ ] [ ]。不工作是什么意思? 我无法在视图中看到任何东西' 这可能是因为您的视图是自定义的并且没有固定的垂直大小(作为文本字段)。那么你不应该在@"V:|-[view1]" 中省略高度,即也修复它@"V:|-[view1(==100)]"。如果有疑问,请在此处发布您的努力。或者只是坚持接受的答案——这取决于你。以上是关于constraintsWithVisualFormat 为所有视图设置相同的 Y 位置的主要内容,如果未能解决你的问题,请参考以下文章