You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:24:28