iOS复习记录日记08-自动布局[2020]

前文

主要记录对于ui的自动布局

正文

0.通过代码计算frame
这个很蠢,但是很自由,通过得到屏幕的宽度和高,自动用代码调整组件的显示比例.
没什么好讲的,想怎么用就怎么用.

1.autoresizing自动调整
它的核心思想就是 参照父类控件的frame,进行自动大小比例适配
(父控件的frame目前是100,子控件就是20)
(如果父控件的frame变成了200,子控件就会变成40)
它有个缺点,就是它只能设置当前控件与父控件之间的相对关系.

2.autolayout自动布局
如autoresizing它无法保证兄弟控件的间距.它只能根据父容器的
但是autolayout可以有非常方便的自动布局设置.

3.size classes+autolayout
因为苹果的屏幕越来越多了,用autolayout也无法完美适配了
要通过使用约束来进行完美适配.
它可以在不同的屏幕下,使用不同的规则
比如:在3.5inch的屏幕希望某个按钮在上边显示,但在4.7inch希望这个按钮显示在中间

autoresizing是一种老的技术,不推荐使用了,了解就行
应该主要学习autolayout,且autolayout和autoresizing是互斥的.只能使用一种.

通过autoresizing实现案例:

屏幕的四角,分别放入四个正方形按钮,无论屏幕大小改变,四角按钮始终如一.
1.因为autoresizing是参照父类的,所以必须在view里面放入一个view
在这个view里面放入按钮.
这个时候启动手机,是没问题的,但是屏幕横过来,四角的方块显示立刻就出现了问题.

使用autoresizing,点击右边的小尺子按钮
找到autoresizing选项.一共有6个边(里面的4个边其实是2个)
外边的4个边,就是相对于父容器的位置.
上边的线:距离父控件的距离是不是固定的
(如果不是固定的,那么父类的高变大,这个组件是不会跟着父类的上移的)
左边的线:距离父控件的距离是不是固定的
(如果不是固定的,那么父类的宽变大,这个组件是不会跟着父类的左移的)
下右也是同理
如果全部都没有选,那么它会根据父类的比例,自动的移动.
比如父类变大1倍,那么它的坐标就会变大1倍.但是自身大小并不会改变.

里面的2个边,是否会随着父容器的宽高,而自动增加
如果都选择了,父类变大了,子类也会变大
如果变大的时候,还想让有相对的距离,设置外边的线就行.

通过代码实现autoresizing的设置
使用Uiview的autoresizingMask进行设置. 里面的枚举打开头代码看.
主要枚举里面给的是可变选项,如果设置left为可变,那么right就是不可变.
想要多设置用|符号就可以了

用过autolayout实现案例

主要是根据某个控件,来设置参照或者约束的.
比如控件1参照控件2 的y距离为10,那么autolayout会根据这个设定.来自动布局.
很明显这样的需求autoresizing是做不到的,它只能根据父控件来自动的变化大小而已

第一个按钮 是对齐的设置
leading edges 左部对齐
training edges 右部对齐
top edges 顶对齐
bottom edges 底对齐
horizontal centers
vertical centers
baselines
horizontal center in container 父容器中水平对齐
vertical center in container 父容器中垂直对齐

第二个按钮 固定frame设置
设置控件距离某个控件的固定距离(它可以选择设置不同控件的距离固定)
width 固定宽 始终不变
height 固定高 始终不变
equal widths 和另外控件的宽一样
equal heights 和另外控件的高一样
aspect ratio 和另外控件的比例一样
align 设置对齐方式.

第三个按钮 解决自动布局的一些问题 辅助按钮
第四个按钮 父控件调整大小后设置子控件的关系

设置完约束后可能会出现红色箭头 这是有问题的
1.只是设置了约束的宽和高,但是没设置具体的位置
2.多于的约束,设置了一次宽高后,又设置了一次宽高.
设置完后出现橙色的警告箭头
按照我们设置的约束,但是按钮的位置和我们的约束不一样
只需要更新下按钮的位置就可以了.这个是没关系的.
按钮这种类型的控件,即使不设置大小,也有默认值.

通过代码添加autolayout约束

如果控件是兄弟之间的约束,就要加到最近的共同的父元素身上
如果是单独的自己的约束,添加自己身上即可.
一个约束就是一个对象NSLayoutConstraint
拿到对应的空间,使用方法addConstraint
警告: 设置之前一定要禁止autoresizing功能为NO
view.translatesAutoresizingMaskIntoConstraints = NO
并且不用给view设置frame

对象NSLayoutConstraint使用类方法进行初始化
x对象的什么属性 等于 b对象的什么属性
乘以multiplier 加 constant

基于autolayout的动画

拖线后得到属性,更改想要的
但是记得,在uiview里面执行动画的代码.是没用的
要额外调用layoutIfNeede方法

发布了15 篇原创文章 · 获赞 0 · 访问量 2561

猜你喜欢

转载自blog.csdn.net/u014270781/article/details/105322469