使用Auto Layout可视格式字符串均匀分布间距

flo*_*hei 7 user-interface cocoa-touch uiview nslayoutconstraint nsautolayout

是否可以平均分配左侧和右侧的空间b@"|-[a(5)]-[b(8)]-[c(5)]-|"利用视觉格式字符串?

Ben*_*eah 15

Apple的Auto Layout Guide建议使用"spacer views".这是在水平方向上以相等间距布置三个视图的解决方案:

// create views dictionary
NSMutableDictionary *viewsDictionary = [NSMutableDictionary dictionary];
[viewsDictionary addEntriesFromDictionary:NSDictionaryOfVariableBindings(viewA, viewB, viewC)];

// create 4 spacer views
for (int i = 0; i < 4; i++) {
    UIView *spacerView = [[UIView alloc] init];
    spacerView.hidden = YES;
    [self addSubview:spacerView];
    [viewsDictionary setObject:spacerView
                        forKey:[NSString stringWithFormat:@"spacer%d", i + 1]];
}

// disable translatesAutoresizingMaskIntoConstraints in views for auto layout
[viewsDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
{
    [obj setTranslatesAutoresizingMaskIntoConstraints:NO];
}];

// add constraints
[superview addConstraints:
 [NSLayoutConstraint constraintsWithVisualFormat:
  @"|[spacer1(>=0)][viewA][spacer2(==spacer1)][viewB][spacer3(==spacer1)][viewC][spacer4(==spacer1)]|"
                                         options:kNilOptions
                                         metrics:nil
                                           views:viewsDictionary]];
Run Code Online (Sandbox Code Playgroud)

请注意,spacer1宽度设置为大于0.后续间隔视图设置为具有相等的宽度spacer1.


jrt*_*ton 13

没有.

但是,您可以使用可视格式和手动约束创建来完成此操作.将您的VFL字符串更改为:

@"|-[a(5)]->=0-[b(8)]->=0-[c(5)]-|"
Run Code Online (Sandbox Code Playgroud)

这表示你并不太关心a和b之间以及b和c之间空间的实际大小.

现在,创建一个约束将b的中心固定到superview的中心constraintWithItem:...(我在手机上输入这个,所以请原谅我没有拼出整个方法).

这与您灵活的间距相结合,将为b的左侧和右侧提供均匀的空间.