iOS开发中如何计算两个重叠UIView的重叠区域frame
计算两个UIView重叠区域的Frame
两个UIView的重叠区域计算本质是求两个轴对齐矩形的交集,UIKit原生已经提供了对应计算方法,不需要手动写坐标比对逻辑,只需要注意提前把两个视图的位置转换到同一坐标系下即可,该逻辑覆盖所有矩形重叠场景:
实现注意点
- 计算前必须保证两个参与计算的矩形处于同一个坐标系,否则结果会出错:如果两个视图不在同一个父视图层级,需要通过
convertRect相关方法把两个视图的bounds转换到同一个公共参照视图的坐标系下 - 系统方法会自动处理所有重叠情况:包括部分重叠、单视图完全包含另一视图、无重叠、边缘贴合等场景
- 两个视图边缘刚好贴合(无实际像素重叠)时,系统会判定为无重叠区域,符合UI展示的实际预期
- 无实际重叠时,计算返回的空矩形可以通过
CGRectIsNull(OC)/isNull(Swift)直接判断,不需要额外做坐标比较
代码实现
Objective-C 版本
// 替换为你要参照的公共父视图,比如两个视图的最上层共同父视图、keyWindow都可以 UIView *commonReferView = view1.superview; // 转换两个视图的区域到统一坐标系 CGRect rect1 = [view1 convertRect:view1.bounds toView:commonReferView]; CGRect rect2 = [view2 convertRect:view2.bounds toView:commonReferView]; // 计算重叠区域 CGRect overlapFrame = CGRectIntersection(rect1, rect2); if (CGRectIsNull(overlapFrame)) { // 无重叠的处理逻辑 } else { // overlapFrame就是所求的重叠区域frame }
Swift 版本
// 替换为公共参照视图 let commonReferView = view1.superview! // 坐标转换 let rect1 = view1.convert(view1.bounds, to: commonReferView) let rect2 = view2.convert(view2.bounds, to: commonReferView) // 计算重叠区域 let overlapFrame = rect1.intersection(rect2) if overlapFrame.isNull { // 无重叠处理逻辑 } else { // overlapFrame即为所求重叠区域frame }
手动计算逻辑(不推荐,仅做原理参考)
如果要手动计算坐标,规则如下,计算结果和系统方法完全一致:
- 重叠区域x起点:取两个矩形最小x值的较大者
max(rect1.minX, rect2.minX) - 重叠区域y起点:取两个矩形最小y值的较大者
max(rect1.minY, rect2.minY) - 重叠区域宽度:两个矩形最大x值的较小者减去x起点,结果小于等于0则无重叠
- 重叠区域高度:两个矩形最大y值的较小者减去y起点,结果小于等于0则无重叠
内容的提问来源于stack exchange,提问作者Bluebyte
相关产品推荐
相关产品推荐

