Swift中如何控制部分子UIView不超出父视图范围?
控制子视图是否超出父视图的解决方案
嘿,这个需求我之前做项目时刚好碰到过,来给你捋清楚~
首先明确:UIView本身的clipsToBounds属性是全局控制所有子视图的——设为YES时,所有子视图超出父视图的部分都会被裁剪;设为NO时,所有子视图都能超出显示。所以这个属性没法直接实现你“部分子视图允许超出、部分不允许”的混合需求。
下面给你两种最常用的实现方式,你可以根据自己的场景选择:
方式一:给需要裁剪的子视图套容器视图(最推荐)
这种方式简单直观,也是苹果官方比较认可的做法:
- 给第二个子视图(frame
(0,95,10,10))单独创建一个容器UIView - 容器视图的frame要刚好对应父视图中允许第二个子视图显示的区域:这里父视图高度是100,所以容器的frame设为
(0,95,10,5)(刚好覆盖父视图底部的5个单位) - 把第二个子视图的frame改成
(0,0,10,10),加到容器视图里,然后给容器视图设置clipsToBounds = YES - 最后把容器视图加到原父视图上,同时原父视图保持
clipsToBounds = NO。这样第一个子视图能正常超出显示,第二个子视图超出容器的部分会被裁剪,也就不会超出原父视图了
方式二:用Auto Layout约束精准控制(适合Auto Layout场景)
如果你的布局是用Auto Layout搭建的,那可以直接通过约束实现:
- 给第一个子视图设置约束时,允许它的边缘超出父视图(比如顶部约束设为父视图顶部减5,不用加优先级限制)
- 给第二个子视图设置底部约束时,绑定到父视图的底部,并且把这个约束的优先级设为最高(比如1000),这样它的底部就永远不会超出父视图,会自动调整位置或高度来贴合父视图底部
方式三:手动调整frame或自定义裁剪(适合纯代码布局场景)
如果不想加容器视图,也可以用代码手动处理:
- 在父视图的
layoutSubviews方法里,手动修正第二个子视图的frame:计算它的最大Y值不能超过父视图的高度,所以把它的frame改成(0,90,10,10),这样底部刚好和父视图底部对齐 - 或者用Core Graphics在父视图的
drawRect:方法里手动裁剪第二个子视图,但这种方式代码量较大,不如前两种高效
内容的提问来源于stack exchange,提问作者Kautsya Kanu
相关产品推荐
相关产品推荐

