三个固定宽高的视图如何添加约束做到平分屏幕?
小引
前段时间面试,遇到这样一个布局问题。这个问题如果通过手写代码,或者Storyboard
、XIB
加代码,都是很简单就可以实现的。但是,这个问题怎么会问的这么简单呢?前提是,不能写代码。
下面说说我想到的一些不需要写代码的布局方案,如果大家有更好的解决方案,欢迎评论讨论。
问题分析
三个等宽等高的View
不管屏幕旋转,还是屏幕尺寸变化,这三个View
都要做到平分屏幕。简单画个草图就可以得到以下信息:
- 三个
View
两两间隙以及边缘View
与屏幕边缘的间隙都是相同的; - 这三个
View
的中心点在屏幕的三等分点上。
有了这两个思路,问题就好解决了。
解决方案
方案一
通过添加辅助布局View
来实现:通过添加四个辅助View
(下图中灰色的View)来完成布局。
具体怎么实现,大家自行脑补吧。大致说下思路,四个辅助View
等宽且宽度随屏幕宽度变化,另外三个View
宽高固定,并添加好View
之间的约束以及View
与父视图间的约束即可。
方案二
此方案是针对于方案一的优化升级版:只需要添加两个辅助View
即可实现需求。
思路:首先固定中间的View
居中,然后添加的两个辅助View
分别相对于中间居中的View
和父视图添加约束,宽度伸缩,高度固定。这样,这两个辅助View
的宽度在任何情况下都相等,然后在这两个辅助View
里面分别添加上另外的View
,这个View
相对于辅助View
居中即可。
方案三
此方法为进阶方案,当然你如果知道这个方法,也很简单。说它是进阶,是相对于前面两种方案来说的。因为,这种方案不需要添加辅助View
。
这个方法主要用到AutoLayout
的一个API
:
1 | +(instancetype)constraintWithItem:(id)view1 |
这个API
的参数必须满足条件:view1.attr1 = view2.attr2 * multiplier + constant
,这个条件中的multiplier
是此方案的关键点。
通过上面的问题分析,我们可以设定三个view
的中心点来达到效果。首先,设置中间的view
居中。然后,设置左边view
的中心点的x
值为屏幕中心点x
值的0.5
倍,右边view
的中心点的x
值为屏幕中心点x
值的1.5
倍,这个倍数就是multiplier
的值。
小结
以上就是三种简单的解决方案,如果你还有其他的解决方案,欢迎评论。
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0