使用系统自带类进行自动布局必须理解的一个公式
+(instancetype)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attire
relatedBy:(NSLayoutRelation)relation
toItem:(id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier constant:(CGFloat)c;
** 解释:** 某个 view1 的 attribute1 等于(小于或等于/大于或等于)某个 view2 的 attribute2 的 multiplier 倍 加上 constant
** 简明公式:** view1.attribute1 = view2.attribute2 * multiplier + constant;
说明:multiplier 这个属性可以用来进行倍数的放大和缩小
如果你想设置的约束里不需要第二个view,要将第四个参数设为nil,第五个参数设为NSLayoutAttributeNotAnAttribute
举例:
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeRight
multiplier:1
constant:10];
翻译过来就是:view1的左侧,在,view2的右侧,再多10个点,的地方。
系统类的使用
- 使用注意点
1.1. 要对子视图进行布局的时候, 子视图必须先添加到父视图的内部
[self.view addSubview:myView];
1.2. 取消子视图的Autoresizing
练习1.
将 myView 设置为 距离 self.view 的四周的间隙为 10
//居中 的写法
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
//距离底部20单位
//注意NSLayoutConstraint创建的constant是加在toItem参数的,所以需要-20。
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:-20]];
//定义高度是父View的三分之一
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.3 constant:0]];
// 关系枚举
typedef NS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1, 小于等于
NSLayoutRelationEqual = 0, 等于
NSLayoutRelationGreaterThanOrEqual = 1, 大于等于
};
// 约束的枚举
typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1, 左侧
NSLayoutAttributeRight, 右侧
NSLayoutAttributeTop, 上方
NSLayoutAttributeBottom, 下方
NSLayoutAttributeLeading, 前面(首部)
NSLayoutAttributeTrailing, 后面(尾部)
NSLayoutAttributeWidth, 宽
NSLayoutAttributeHeight, 高
NSLayoutAttributeCenterX, 中心x(x轴中心)
NSLayoutAttributeCenterY, 中心y(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 没有约束
};
NSLayoutAttributeLeft/NSLayoutAttributeRight 和NSLayoutAttributeLeading/NSLayoutAttributeTrailing的区别是left/right永远是指左右,而leading/trailing在某些从右至左习惯的地区会变成,leading是右边,trailing是左边。(大概是⊙﹏⊙b)