Swift-检测不同父视图的子视图是否相交

7

我正在尝试检测两个视图是否相交:一个是主storyboard的子视图,另一个是主storyboard的子视图的子视图。

我尝试使用 subview1.frame.intersects(subview2.frame),但它不起作用。上述函数总是返回false

至于背景,我正在尝试拖动subview1并将其放在subview2上,并在PanGesture.Ended状态下检测两个视图之间的碰撞。

视图层次结构可以表示如下:

     main view
    /         \
subview1      view2
                \
                subview2

什么不起作用?有什么错误?你需要提供更多的信息,这样我们才能开始回答你的问题。 - fulvio
3个回答

14

没有看到你的视图层级结构,我只能猜测可能是因为.intersects比较的是在同一坐标空间内的两个矩形,而你的视图可能有不同的坐标空间(除非它们是具有相同超级视图的兄弟视图,因为.frame始终在您的超级视图的坐标中)。UIView拥有许多转换方法(您需要convertRect:fromView),可以将点或矩形从一个视图的坐标空间转换到另一个视图。一旦你把两个矩形放在同一个坐标空间里,就可以使用/intersects()。

subview1.frame.intersects(subview1.convertRect(subview2.frame, fromView: subview2))

5
没错,你是正确的!稍微修改一下你的代码,我就能让它正常工作了:subview1.frame.intersects(self.view.convertRect(subview2.bounds, fromView: subview2)) 当两个视图相交时将返回 true。但是为什么使用 subview1.bounds.intersects(subview2.bounds) 也可以呢? - Alic

4
我使用bounds而不是frame使其正常工作。因此,通过使用subview1.bounds.intersects(subview2.bounds),当我将subview1放在subview2上时,它将返回true
根据这里的说法:

UIViewbounds是一个矩形,表示为位置(x,y)和大小(width,height),相对于其自己的坐标系(0,0)。

UIViewframe是一个矩形,表示为位置(x,y)和大小(width,height),相对于其所包含的父视图。

我不确定为什么在两个UIView具有不同的父级时,使用带有位置和大小的CGRect会起作用。如果有人能进一步解释,我将接受那个答案。

-1

如果您只是想检测它们是否相交,那么只需:

  • 在Xcode中运行项目
  • 进入调试选项卡
  • 然后在下面点击查看调试信息
  • 最后点击显示视图框架

您将会看到这些视图是否相互交叉。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接