如何通过编程在所有iOS设备上保持视图间及上下间距相等?
解决iPhone全尺寸下均等间距布局问题
嘿,我来帮你搞定这个布局难题!你想要的是顶部到view1、view1到view2、view2到底部的三个间距在所有iPhone上保持相等,同时避免logo占满整个屏幕宽度,这两个问题其实可以一起解决,给你两种靠谱的实现方案:
方案一:优化UIStackView的使用(更简洁)
你之前用StackView的思路是对的,但选错了distribution属性,而且没限制子视图的宽度,才导致logo拉伸:
- 把view1和view2放进垂直UIStackView,设置这两个核心属性:
axis = .vertical(垂直排列子视图)distribution = .equalSpacing(让子视图之间的间距,以及StackView顶部到底部的剩余空间自动均分,刚好满足你三个间距相等的需求)alignment = .center(关键!让子视图在水平方向居中,不会被强制拉伸填满StackView宽度)
- 给StackView添加约束:顶部绑定父视图顶部、底部绑定父视图底部(不用设具体间距数值,
equalSpacing会自动分配出三个均等的间距) - 给logo所在的视图(比如view1里的UIImageView)添加宽高约束或者宽高比约束,比如:
这样logo就会保持固定大小,不会被无限制拉伸。logoImageView.widthAnchor.constraint(equalToConstant: 120).isActive = true logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 1).isActive = true
方案二:手动添加Auto Layout约束(更灵活)
如果觉得StackView不够灵活,直接用约束手动控制会更直观:
- 给view1设置顶部约束和水平居中:
view1.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: X).isActive = true view1.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true - 给view2设置和view1的间距、底部约束,以及水平居中:
view2.topAnchor.constraint(equalTo: view1.bottomAnchor, constant: X).isActive = true view2.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -X).isActive = true view2.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true - 同样给logo添加宽高约束避免拉伸:比如设置宽度不超过父视图的50%,同时保持宽高比:
logoImageView.widthAnchor.constraint(lessThanOrEqualTo: view.widthAnchor, multiplier: 0.5).isActive = true logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 1).isActive = true
这里的X不用写死数值,如果你想让间距随屏幕尺寸自适应,可以把X设为父视图高度的某个比例,比如:
let X = view.bounds.height * 0.1
这样不管是小屏的SE还是大屏的14 Pro Max,三个间距都会保持相等,同时logo也不会乱拉伸啦!
内容的提问来源于stack exchange,提问作者Bhanu
相关产品推荐
相关产品推荐

