11

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

约束销

前导空间的约束实际上是相同的。约束值为42.0 点

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

现在我想在代码中添加另一个视图,该视图也将前导和尾随空间固定到它的超级视图边距,因此相同的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 进行固定?

4

2 回答 2

15

在 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 创建约束时引用布局边距,则使用新的 iOS8 only 布局属性:

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];
于 2014-10-10T17:43:34.160 回答
4

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

因此,当您使用 Interface builder 来辅助布局时,您应该勾选“Constrains to margin”选项。如果是这样,那么它确实有效。

如果问题还没有解决,可以给我一个demo项目吗?

补充:这篇文章向我们展示了新的ios8 APIpreservesSuperviewLayoutMargins的功能,希望对您有所帮助。

于 2014-11-28T08:55:26.423 回答