Cocoa touch 使用自动布局视觉格式字符串均匀分布间距

Cocoa touch 使用自动布局视觉格式字符串均匀分布间距,cocoa-touch,user-interface,uiview,nslayoutconstraint,autolayout,Cocoa Touch,User Interface,Uiview,Nslayoutconstraint,Autolayout,在@“|-[a(5)]-[b(8)]-[c(5)]-”中,是否可以使用可视格式字符串平均分配b的左右空间 但是,您可以使用可视格式和手动创建约束来完成此操作。将VFL字符串更改为: @"|-[a(5)]->=0-[b(8)]->=0-[c(5)]-|" 这表示您不太关心a和b之间以及b和c之间的空间的实际大小 现在,使用constraintWithItem:…创建一个约束,将b的中心固定到superview的中心(我正在电话上键入此项,请原谅我没有详细说明整个方法) 这与灵活的间距

@“|-[a(5)]-[b(8)]-[c(5)]-”
中,是否可以使用可视格式字符串平均分配
b
的左右空间

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

@"|-[a(5)]->=0-[b(8)]->=0-[c(5)]-|"
这表示您不太关心a和b之间以及b和c之间的空间的实际大小

现在,使用
constraintWithItem:…
创建一个约束,将b的中心固定到superview的中心(我正在电话上键入此项,请原谅我没有详细说明整个方法)

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

苹果建议使用“间隔视图”。以下是以相等间距水平布置三个视图的解决方案:

// 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]];
//创建视图字典
NSMutableDictionary*viewsDictionary=[NSMutableDictionary];
[viewsDictionary:NSDictionaryOfVariableBindings(viewA、viewB、viewC)]中的图片附录;
//创建4个间隔视图
对于(int i=0;i<4;i++){
UIView*spacerView=[[UIView alloc]init];
spaceview.hidden=是;
[自添加子视图:间隔视图];
[viewsDictionary setObject:视图
forKey:[nsstringwithformat:@“间隔符%d”,i+1]];
}
//在视图中禁用TranslatesAutoResizengMaskinToConstraints以进行自动布局
[viewsDictionary enumerateKeysAndObjectsUsingBlock:^(id键、id对象、布尔*停止)
{
[obj setTranslatesAutoresizingMaskIntoConstraints:否];
}];
//添加约束条件
[超级视图添加限制:
[NSLAYOUTCONSTRAINTS WITH VISUALFORMAT:
@“|[spacer1(>=0)][viewA][spacer2(=spacer1)][viewB][spacer3(=spacer1)][viewC][spacer4(=spacer1)]|”
选项:针织品
指标:零
视图:viewsDictionary]];

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

相同的宽度,这听起来很棒。我要试一试。谢谢很好用。这么简单。谢谢!:-)你是如何“将b的中心固定到superview的中心”的@flohei?难道不能同时使用可视化格式,或者必须使用
constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
?有什么理由不简单地编写
NSDictionary*views=NSDictionaryOfVariableBindings(viewA、viewB、viewC)?我已经编辑了答案,以便在NSDictionaryOfVariableBindings中使用多个参数。我正在使用一个可变字典,这样我就可以动态地将我的间隔视图添加到其中。哦,对了<代码>NSMutableDictionary*视图=NSDictionaryOfVariableBindings(viewA、viewB、viewC)然后。非常好,所以这篇文章与这个问题相关