Swift:UIView 与哪个方向相交?

Posted

技术标签:

【中文标题】Swift:UIView 与哪个方向相交?【英文标题】:Swift: Which direction a UIView is being intersected from? 【发布时间】:2015-02-19 14:34:18 【问题描述】:

我正在使用CGRectIntersectsRect 来测试blueView(被拖动)是否与redView(静止)相交。但是,我需要知道redView 是否与红色的顶部、底部、右侧或左侧的blueView 相交? 有没有CG方法可以做到这一点?

【问题讨论】:

我认为没有直接的方法可以做到这一点。您必须通过比较角点来编写所有复杂的条件。而且您还可以通过角落进入,而不仅仅是侧面。 CGRectIntersection 返回两个矩形的交集。 【参考方案1】:

我不知道有任何 CG 方法可以实现这一点。

我要解决这个问题的方法是使用CGRectIntersectsRect 检查它们是否完全相交,然后如果它们相交,则从redView 的中心测量到blueView 这将返回它们之间的距离( X 和 Y),从中你可能知道交叉点来自哪个角度?

如果您想要更高的精度,您可以从redView 顶部中心到blueView 底部中心进行测量,并且所有 4 个边缘都相同?然后找出哪个最接近?

有多种方法可以解决这个问题,但我不知道“一种方法适合所有”的解决方案。

编辑:

还在想这个,我觉得最准确的方法是这样的:

let leftDistance = blue.origin.x - (red.origin.x + red.width)
let rightDistance = (blue.origin.x + blue.width) - red.origin.x
let topDistance = blue.origin.y - (red.origin.y + red.height)
let bottomDistance = (blue.origin.y + blue.height) - red.origin.y

这些距离中的最低者 = 来自左侧、右侧、顶部或底部。

(附注:我可能弄错了蓝色 + 红色,以及顶部和底部。我建议在拖动项目时试一试并记录这些值)

【讨论】:

【参考方案2】:

这是我最终使用的解决方案,以防其他人正在寻找它。下面的代码行测试交叉点是否垂直(顶部和底部视图相交),其中 a 和 b 是两个视图相交的每一个的 view.frame。

if ((a.maxY > q.maxY) && (b.minY < q.minY)) || ((a.maxY < q.maxY) && (b.minY > q.minY))

【讨论】:

这里的“q”是什么。能详细解释一下吗?

以上是关于Swift:UIView 与哪个方向相交?的主要内容,如果未能解决你的问题,请参考以下文章

当设备方向更改 SWIFT 5 时重绘自定义 UIVIEW

如何在 Swift 2.0 中获得正确的 UIView 大小或边界?

在Swift ios中方向更改为横向模式时隐藏底部表格视图

在 Swift 中,如何使用自动布局为 UIView 设置动画,就像页面滑入一样?

UIView 动画发生在错误的方向

UICollectionView 触摸时动画