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

对前导空间的约束也是有效的。约束的值为42.0 points__。
这正是我想要的,因为对于不同的设备,我可以在UIView上更改UIView属性,这些约束将正确工作,以增加视图之间的空白。
现在,我想在代码中添加另一个视图,该视图的引导空间和尾随空间都固定在它的superview边距上,因此将相同的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];这是可行的,但是layoutMargins属性使用此约束没有任何影响,因此它显然不是固定在边距上,而是直接绑定到superview。
所以我的问题是:
如何使用可视化格式语言在代码中将UI元素空间插入边距?如果不可能,如何使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: API??
发布于 2014-10-10 17:43:34
在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];发布于 2014-11-28 08:55:26
我同意,“在iOS8中,视觉格式语言已经被更新了,所以默认使用由superview的layoutMargins属性定义的间隔。”
因此,当您使用Interface来帮助您的布局时,您应该勾选“约束到边距”选项。如果是这样的话,那么它确实有效。
如果问题还没有解决,你能给我一个演示项目吗?
添加: T他的文章,向我们展示了新的ios8 API preservesSuperviewLayoutMargins的功能,希望它更有帮助。
https://stackoverflow.com/questions/26157077
复制相似问题