首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式将iOS8自动布局引脚到相对布局裕度

以编程方式将iOS8自动布局引脚到相对布局裕度
EN

Stack Overflow用户
提问于 2014-10-02 08:32:28
回答 2查看 16.9K关注 0票数 11

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

对前导空间的约束也是有效的。约束的值为42.0 points__。

这正是我想要的,因为对于不同的设备,我可以在UIView上更改UIView属性,这些约束将正确工作,以增加视图之间的空白。

现在,我想在代码中添加另一个视图,该视图的引导空间和尾随空间都固定在它的superview边距上,因此将相同的layoutMargins设置为superview可以工作。

我使用可视化格式语言将视图固定在以下语法上:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

发布于 2014-10-10 17:43:34

在iOS8中,视觉格式语言已经被更新,以便默认使用由superview的layoutMargins属性定义的间隔。

因此,使用可视化格式语言的答案如下:

代码语言:javascript
复制
// 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仅限布局属性:

代码语言:javascript
复制
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];
票数 15
EN

Stack Overflow用户

发布于 2014-11-28 08:55:26

我同意,“在iOS8中,视觉格式语言已经被更新了,所以默认使用由superview的layoutMargins属性定义的间隔。”

因此,当您使用Interface来帮助您的布局时,您应该勾选“约束到边距”选项。如果是这样的话,那么它确实有效。

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

添加: T他的文章,向我们展示了新的ios8 API preservesSuperviewLayoutMargins的功能,希望它更有帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26157077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档