iOS8自动布局以编程方式固定到相对布局边距

我有一个UI元素(实际上是UISwitch ,但实际上并不重要),在Interface Builder中将前导空格和尾随空格固定为超级视图。 约束在Xcode 6中看起来像这样:

约束引脚

领导空间的约束是有效的。 约束值是42.0分

这正是我想要的,因为对于不同的设备,我可以更改UIView上的layoutMargins属性和约束将正常工作,以增加视图之间的余量。

现在我想在代码中添加另一个视图,这个视图的前后两个空格都被固定为superview margin,所以相同的layoutMargins设置为superview。

我使用以下语法使用视觉格式语言固定视图:

 NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)]; [self.contentView addConstraints:constraints]; [self.contentView setNeedsUpdateConstraints]; 

这个工作,但layoutMargins属性没有使用这个约束的影响,所以它显然不是固定到保证金,而是直接到超视图。

所以我的问题是:

如何使用可视化格式语言将UI元素空间固定在代码中的边距? 或者如果不可能的话,如何使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: API?

谢谢!

在iOS8中,视觉格式语言已经更新,因此“| – ”或“ – |” 将默认使用由superview的layoutMargins属性定义的间距。

所以使用视觉格式语言的答案如下:

 // programmatically set the layoutMargins, only if // you want non-default values and they are not already set in IB! self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42 // assume: seperatorView is already a subview of self.contentView // separatorView will use the constraints because we write "-" between it and the superview edge NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)]; [self.contentView addConstraints:constraints]; 

如果要在通过直接API创build约束时引用布局边距,则使用新的仅iOS8布局属性:

 NSMutableArray * constraints = [NSMutableArray array]; [constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeLeftMargin relatedBy:NSLayoutRelationEqual toItem:separatorView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0]]; [constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeRightMargin relatedBy:NSLayoutRelationEqual toItem:separatorView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]]; [self.contentView addConstraints:constraints]; 

我同意,“在iOS8中,视觉格式语言已经更新,因此”| – “或” – |“将默认使用超级视图的layoutMargins属性定义的间距。

因此,当您使用“界面”构build器来协助您的布局时,应该勾选“约束到边距”选项。 如果是这样,那么它确实工作。

如果问题仍然没有解决,你能给我一个演示项目吗?

添加: 他的文章向我们展示了新的ios8 API保留的functionSuperviewLayoutMargins,希望它更有帮助。

Interesting Posts