2014-10-02 98 views
10

我有一个UI元素(UISwitch实际上,但实际上并不重要),它的前导和尾随空间都固定在Interface Builder中的超级视图中。约束看起来像这样在Xcode 6:iOS8自动布局以编程方式固定到相对布局边距

Constraint pin

为主导空间的限制是相同有效。约束值为42.0分

这正是我想要的,因为不同的设备,我可以在UIView改变layoutMargins属性和约束将正常工作,在视图间进行提高保证金。

现在我想在代码中添加另一个视图,该视图也将前导和尾随空格固定为超视图边距,因此设置为超视图的相同layoutMargins将起作用。

我固定使用视觉格式的语言语法如下观点:

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进行封装?

谢谢!

回答

14

在iOS8中,视觉格式语言已更新,因此“| - ”或“ - |”将默认使用由超级视图的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的限制时,则使用新的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]; 
4

我同意,“在iOS8上,视觉格式的语言已经被更新,‘| - ’或‘ - |’,将默认使用由上海华盈的layoutMargins属性定义的间距”

所以,当您使用界面生成器来协助您的布局时,您应该勾选“限制边距”选项。如果是这样,那么它确实有效。

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

加入: T his article向我们展示新ios8 API保留的功能SuperviewLayoutMargins,希望它更有帮助。

相关问题