IOSday06 添加约束
Autoresizing
-
四周的四根线的作用:
- 只要勾选上某一根, 那么当前控件距离父控件的距离就是固定的, 当前是多少, 以后永远都是多少
-
中间两条线的作用:
- 只要勾选上水平方向的线, 那么当前控件的宽度就会随着父控件的宽度等比拉伸
- 只要勾选上垂直方向的线, 那么当前控件的高度就会随着父控件的高度等比拉伸
-
无论是将子控件固定在父控件的某一个位置
还是让子控件随着父控件的宽高的变化而变化都是父子关系, 所以Autoresizing只能约束父子控件之间的关系, 不能约束兄弟控件之间的关系
注意: 代码中的上下左右和Storyboard中的是相反的
-
Storyboard中勾选上左边, 就代表当前控件和父控件的左边的距离是固定的
而在代码中如果写上FlexibleLeftMargin, 就代表当前控件和父控件的左边是可拉伸的
- 换句话说就是: 如果设置了FlexibleLeftMargin
就代表着右边是固定的UIViewAutoresizingFlexibleLeftMargin
左边可以伸缩UIViewAutoresizingFlexibleRightMargin
右边可以伸缩UIViewAutoresizingFlexibleTopMargin
顶部可以伸缩UIViewAutoresizingFlexibleBottomMargin
底部可以伸缩 -
以下两个和Storyboard中的是一样的
UIViewAutoresizingFlexibleWidth
宽度可以伸缩UIViewAutoresizingFlexibleHeight
高度可以伸缩
autolayout
-
1.约束
- 每在Storyboard中添加一个设置(autolayout的设置), 就代表添加一个约束
-
2.错误(红色箭头)
- 如果看到Storyboard中有红色的箭头, 代表约束有错误
- 注意: 约束有错误, 不代表运行会错误, 约束有错误同样可以运行
- 注意: 红色箭头是程序员必须解决的
-
3.为什么会有约束错误?
-
1缺少约束
-
2约束冲突
-
3.1缺少约束
- autolayout的本质和frame差不多
- 如果通过frame来设置一个控件, 必须设置这个控件的x/y/w/h, 控件才能按照我们的需求显示
- 如果是通过autolayout来设置一个控件, 也必须设置这个控件的x/y/w/h, 控件才能按照我们的需求显示
- 也就是说, 如果说x/y/w/h只要有一个没有设置都会报错, 就是缺少约束
-
3.2约束冲突
- 约束可以重复添加
- 例如先约束宽度等于100, 又添加一个约束, 约束宽度等200, 那么就会报错
-
-
4.警告
- 如果看到Storyboard中有黄色的箭头, 就是警告
- 代表着当前控件预览的位置或者尺寸和我们约束的位置尺寸不一样
- 注意:黄金警告并不会影响我们运行
- 注意:黄色箭头, 程序员可以忽略
- 如果看到Storyboard中有黄色的箭头, 就是警告
VFL添加约束
VFL不支持乘除法
-
3.利用VFL添加约束
VisualFormat
: VFL语句options
: 对齐方式等metrics
: VFL语句中使用到的一些变量views
: VFL语句中使用到的一些控件
-
3.1设置蓝色
- 水平方向
[self.view addConstraints:blueHCos];```
-
3.1.2垂直方向
[self.view addConstraints:blueVCos];```
Masonry 添加约束
define MAS_SHORTHAND
define this constant if you want to use Masonry without the 'mas_' prefix
-
只要添加这个宏, 就可以去掉Masonry框架中对象访问对象属性前面的mas_属性, 和方法前的mas_前缀
-
例如添加前的写法
make.left.equalTo(self.view.mas_left).with.offset(20);
- 例如添加后的写法
make.left.equalTo(self.view.left).with.offset(20);
define MAS_SHORTHAND_GLOBALS
- 只要添加上这个宏, 给equalTo传递参数的时候, 就可以直接传递基本数据类型 ,系统会自动包装
- 如果没有添加上面这个宏, 那么给equalTo传递参数的时候, 必须传递对象
- 如果要传递基本数据类型必须使用mas_equalTo
只需要在导入Masonry.h之前, 添加上一上两个宏, 就可以简化代码
注意: 在Storyboard中约束是可以重复添加的, 通过Masonry添加约束也是可以重复的, 要注意重复添加导致的错误和冲突
使用makeConstraints, 每次都会添加新的约束, 也就是会导致重复添加
要更新约束使用updateConstraints
-
updateConstraints特点: 如果没有设置过, 就添加一个新的
-
如果已经设置过了, 就更新以前设置的那一个
make.height.equalTo(100);
}];```
-
清空约束 remakeConstraints
[self.blueVeiw remakeConstraints:^(MASConstraintMaker *make)
Compact/Regular/Any
-
图片中的设置:
height = Any & compact
- 代表宽度是任意的, 高度是紧凑的
*==Any - ==Compact
- ==Regular
前面的是宽度, 后面的是高度
- Any: 任意的
- 代表宽度是任意的, 高度是紧凑的
- compact: 紧凑的
- Regular:正常的
---ss