iOS开发:如何通过AutoLayout实现屏幕尺寸适配?
从AutoresizingMask转AutoLayout实现自适应屏幕视图
嘿,我完全懂你想把旧的AutoresizingMask布局切换到AutoLayout,实现红色视图随屏幕尺寸自适应的需求——你之前遇到的问题其实很典型:同时添加了四边间距约束和固定宽高约束,这俩是互斥的!
当你把红色视图的Leading、Trailing、Top、Bottom都绑定到父视图(屏幕)时,视图的宽高已经由父视图的尺寸和你设置的间距自动计算出来了,再加固定宽高约束就会让AutoLayout陷入冲突,系统不知道该遵循哪个规则。下面分两种场景给你具体的实现方法:
用Interface Builder(可视化布局)实现
- 先选中你的红色视图,删掉之前添加的Width和Height约束(这是关键!)
- 选中红色视图,点击右下角的「Add New Constraints」按钮
- 在弹出的约束面板里,分别设置Leading、Trailing、Top、Bottom的间距值(比如都设为20),然后点击「Add 4 Constraints」
- 此时红色视图会自动跟随父视图(屏幕)的尺寸变化:屏幕变宽时,视图宽度会增加(保持左右20的间距);屏幕变高时,视图高度也会对应增加(保持上下20的间距)
- 如果想要间距随屏幕比例变化(比如左右间距始终是屏幕宽度的10%),可以双击对应的约束,把「Constant」改成「Multiplier」:比如Leading约束的Multiplier设为0.1,Trailing约束的Multiplier设为0.9(因为Trailing是从父视图右侧往左计算,0.9就相当于右边距占10%)
用代码实现AutoLayout
如果是纯代码布局,记得先关闭AutoresizingMask的自动转换,然后添加四边约束即可:
// 假设redView是你的红色视图,superView是它的父视图(比如ViewController的view) redView.translatesAutoresizingMaskIntoConstraints = false // 必须关闭,否则旧的mask会干扰AutoLayout // 激活四边约束 NSLayoutConstraint.activate([ // 左边距20 redView.leadingAnchor.constraint(equalTo: superView.leadingAnchor, constant: 20), // 右边距20(注意constant是负数,因为trailing锚点是从父视图右侧往左算) redView.trailingAnchor.constraint(equalTo: superView.trailingAnchor, constant: -20), // 上边距20 redView.topAnchor.constraint(equalTo: superView.topAnchor, constant: 20), // 下边距20 redView.bottomAnchor.constraint(equalTo: superView.bottomAnchor, constant: -20) ])
如果要实现比例间距,把constant换成multiplier即可:
NSLayoutConstraint.activate([ redView.leadingAnchor.constraint(equalTo: superView.leadingAnchor, multiplier: 0.1), redView.trailingAnchor.constraint(equalTo: superView.trailingAnchor, multiplier: 0.9), redView.topAnchor.constraint(equalTo: superView.topAnchor, multiplier: 0.1), redView.bottomAnchor.constraint(equalTo: superView.bottomAnchor, multiplier: 0.9) ])
最后再提醒一句:如果之前给视图设置过AutoresizingMask,一定要确保translatesAutoresizingMaskIntoConstraints设为false,否则系统会自动把旧的mask转换成约束,和你手动添加的约束产生冲突,导致布局异常。
内容的提问来源于stack exchange,提问作者Ankur Patel
相关产品推荐
相关产品推荐

