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 位置的主要内容,如果未能解决你的问题,请参考以下文章