iOS8自动布局编程相对布局边距

我有一个UI元素(实际上是UISwitch,但实际上并不重要),它们在引导和拖尾空间中都被固定在界面生成器中. Xcode 6中的约束看起来像这样:

领先空间的限制是有效的.约束值为42.0分.

这正是我想要的,因为对于不同的设备,我可以在UIView上更改layoutMargins属性,约束将正常工作,以增加视图之间的边距.

现在我想在代码添加一个视图,这个视图也会占据领先地位和尾随空间,从而将SuperView设置为相同的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中,视觉格式语言已更新,以便“| – ”或“ – |”将认使用由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,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];

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...