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

问题描述 投票:10回答:2

我有一个UI元素(实际上是UISwitch,但实际上并不重要),该元素具有固定在Interface Builder中的superview的前导和尾随空间。约束在Xcode 6中看起来像这样:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90OVZobi5wbmcifQ==” alt =“约束销”>

前导空间的约束实际上是相同的。约束的值为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属性使用此约束无效,因此,显然它没有固定在边距上,而是直接固定在superview上。

所以我的问题是:

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

ios ios8 autolayout xcode6 visual-format-language
2个回答
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中,视觉格式语言已更新,因此” |-“或”-|“将默认使用由Superview的layoutMargins属性定义的间距。”

因此,在使用“界面”构建器来辅助布局时,应勾选“约束到边距”选项。如果是这样,那么它确实起作用。

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

添加:T his article向我们展示了新的ios8 API函数,它可以保存SuperviewLayoutMargins,希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.