Objective-C
+ (instancetype)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(nullable id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c;
参数说明:
第一个参数 view1: 要约束的控件;
第二个参数 attr1: 约束的类型(做怎样的约束);
第三个参数 relation: 与参照控件之间的关系;
第四个参数 view2: 参照的控件;
第五个参数 attr2: 约束的类型(做怎样的约束);
第六个参数 multiplier: 乘数,控件 1 的指定属性是参照控件 2 指定属性的多少倍;
第七个参数 c: 常量,控件 1 的指定属性需要加的浮点数。
根据参数的讲解,得出计算公式如下:
view1.attr1 [= , >= , <=] view2.attr2 * multiplier + c;
参数详解:
1、NSLayoutAttribute
NSLayoutAttributeLeft = 1, 左边缘,CGRectGetMinX(view.frame)
NSLayoutAttributeRight, 右边缘,CGRectGetMaxX(view.frame)
NSLayoutAttributeTop, 上边缘,CGRectGetMinY(view.frame)
NSLayoutAttributeBottom, 下边缘,CGRectGetMinY(view.frame)
NSLayoutAttributeLeading, 前边缘,在习惯由左向右看的地区相当于 Left,
在习惯从右至左看的地区相当于 Right
NSLayoutAttributeTrailing, 后边缘,在习惯由左向右看的地区相当于 Right,
在习惯从右至左看的地区相当于 Left
NSLayoutAttributeWidth, 宽度,CGRectGetWidth(view.frame)
NSLayoutAttributeHeight, 高度,CGRectGetHeight(view.frame)
NSLayoutAttributeCenterX, 水平中心,view.center.x
NSLayoutAttributeCenterY, 垂直中心,view.center.y
NSLayoutAttributeBaseline, 文本底标线
NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline, 文本底标线
NSLayoutAttributeFirstBaseline 文本上标线,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeLeftMargin 左边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeRightMargin 右边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeTopMargin 上边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeBottomMargin 下边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeLeadingMargin 前边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeTrailingMargin 后边缘,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeCenterXWithinMargins 宽度,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeCenterYWithinMargins 高度,NS_ENUM_AVAILABLE_IOS(8_0)
NSLayoutAttributeNotAnAttribute = 0 清除所有约束
2、NSLayoutRelation
NSLayoutRelationLessThanOrEqual = -1, 小于等于
NSLayoutRelationEqual = 0, 等于
NSLayoutRelationGreaterThanOrEqual = 1, 大于等于
// 创建约束
// redView 的左边缘与 greenView 的左边缘对齐
NSLayoutConstraint *constraintX = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:greenView
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:0];
// redView 的上边缘等于 greenView 的上边缘加 100
NSLayoutConstraint *constraintY = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:greenView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:100];
// redView 的宽度等于 100
NSLayoutConstraint *constraintW = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:100];
// redView 的高度等于 50
NSLayoutConstraint *constraintH = [NSLayoutConstraint constraintWithItem:redView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:50];
// 将约束添加到视图上
/*
相对于另一个视图的约束必须添加到其父视图上
*/
[self.view addConstraint:constraintX];
[self.view addConstraint:constraintY];
[redView addConstraint:constraintW];
[redView addConstraint:constraintH];
Swift
public convenience init(item view1: AnyObject,
attribute attr1: NSLayoutAttribute,
relatedBy relation: NSLayoutRelation,
toItem view2: AnyObject?,
attribute attr2: NSLayoutAttribute,
multiplier: CGFloat,
constant c: CGFloat)
参数说明:
第一个参数 view1: 要设置的视图;
第二个参数 attr1: view1 要设置的属性;
第三个参数 relation: 视图 view1 和 view2 的指定属性之间的关系;
第四个参数 view2: 参照的视图;
第五个参数 attr2: 参照视图 view2 的属性;
第六个参数 multiplier: 视图 view1 的指定属性是参照视图 view2 指定属性的多少倍;
第七个参数 c: 视图 view1 的指定属性需要加的浮点数。
根据参数的讲解,得出计算公式如下:
view1.attr1 [= , >= , <=] view2.attr2 * multiplier + c;
参数详解:
1、NSLayoutAttribute
case Left 左边缘,CGRectGetMinX(view.frame)
case Right 右边缘,CGRectGetMaxX(view.frame)
case Top 上边缘,CGRectGetMinY(view.frame)
case Bottom 下边缘,CGRectGetMinY(view.frame)
case Leading 前边缘,在习惯由左向右看的地区相当于 Left,在习惯从右至左看的地区相当于 Right
case Trailing 后边缘,在习惯由左向右看的地区相当于 Right,在习惯从右至左看的地区相当于 Left
case Width 宽度,CGRectGetWidth(view.frame)
case Height 高度,CGRectGetHeight(view.frame)
case CenterX 水平中心,view.center.x
case CenterY 垂直中心,view.center.y
case Baseline 文本底标线
case FirstBaseline 文本上标线,@availability(iOS, introduced=8.0)
case LeftMargin 左边缘,@availability(iOS, introduced=8.0)
case RightMargin 右边缘,@availability(iOS, introduced=8.0)
case TopMargin 上边缘,@availability(iOS, introduced=8.0)
case BottomMargin 下边缘,@availability(iOS, introduced=8.0)
case LeadingMargin 前边缘,@availability(iOS, introduced=8.0)
case TrailingMargin 后边缘,@availability(iOS, introduced=8.0)
case CenterXWithinMargins 宽度,@availability(iOS, introduced=8.0)
case CenterYWithinMargins 高度,@availability(iOS, introduced=8.0)
case NotAnAttribute 清除所有约束
2、NSLayoutRelation
case LessThanOrEqual 小于等于
case Equal 等于
case GreaterThanOrEqual 大于等于
// 创建约束
// redView 的左边缘与 greenView 的左边缘对齐
let constraintX = NSLayoutConstraint(item: redView,
attribute: .Left,
relatedBy: .Equal,
toItem: greenView,
attribute: .Left,
multiplier: 1.0,
constant: 0)
// redView 的上边缘等于 greenView 的上边缘加 100
let constraintY = NSLayoutConstraint(item: redView,
attribute: .Top,
relatedBy: .Equal,
toItem: greenView,
attribute: .Top,
multiplier: 1.0,
constant: 100)
// redView 的宽度等于 100
let constraintW = NSLayoutConstraint(item: redView,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: 100)
// redView 的高度等于 50
let constraintH = NSLayoutConstraint(item: redView,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: 50)
// 将约束添加到视图上
/*
相对于另一个视图的约束必须添加到其父视图上
*/
self.view.addConstraint(constraintX)
self.view.addConstraint(constraintY)
redView.addConstraint(constraintW)
redView.addConstraint(constraintH)