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

Leg*_*ess 10 ios autolayout visual-format-language xcode6 ios8

我有一个UI元素(UISwitch实际上,但实际上并不重要),它将前导和尾随空间固定到Interface Builder中的superview.Xcode 6中的约束如下所示:

约束引脚

领先空间的约束是有效的.约束的值是42.0分.

这正是我想要的,因为对于不同的设备,我可以更改layoutMargins属性UIView并且约束将正常工作,以增加视图之间的边距.

现在我想在代码中添加另一个视图,该视图也会将前导和尾随空间固定到它的超级视图边距,因此相同的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];
Run Code Online (Sandbox Code Playgroud)

这是有效的,但layoutMargins属性使用此约束无效,因此它显然不是固定到边距,而是直接固定到superview.

所以我的问题是:

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

谢谢!

alg*_*gal 14

在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];
Run Code Online (Sandbox Code Playgroud)

如果要在通过直接API创建约束时引用布局边距,则使用仅新的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];
Run Code Online (Sandbox Code Playgroud)