我有一个 UI 元素(UISwitch
实际上,但实际上并不重要),它在 Interface Builder 中将前导和尾随空间固定到超级视图。 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?
在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];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)