我有一个UI元素(实际上UISwitch
,但实际上并不重要),其前导和尾随空间都固定在Interface Builder中的superview。约束在Xcode 6中看起来像这样:
领先空间的约束是有效的。约束的值 42.0点。
这正是我想要的,因为对于不同的设备,我可以更改layoutMargins
上的UIView
属性,并且约束将正常工作,以增加视图之间的边距。
现在我想在代码中添加另一个视图,该视图也会将前导和尾随空间固定到它的超级视图边距,因此设置为superview的layoutMargins
相同。{/ p>
我使用可视格式语言固定视图,语法如下:
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?
谢谢!
答案 0 :(得分: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];
如果要在通过直接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];
答案 1 :(得分:4)
我同意,“在iOS8中,视觉格式语言已经更新,因此”| - “或” - |“将默认使用由superview的layoutMargins属性定义的间距。”
因此,当您使用“界面”构建器来辅助布局时,应勾选“约束到边距”选项。如果是这样,那么它确实有效。
如果问题仍然没有解决,你能给我一个演示项目吗?
添加了: T his article向我们展示了新的ios8 API preserveSuperviewLayoutMargins的功能,希望它更有帮助。