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

时间:2016-10-31 02:55:01

标签: ios swift

我试图检测两个视图是否相交:一个视图是主要故事板的子视图,以及一个主要故事板子视图的子视图。

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

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

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

     main view
    /         \
subview1      view2
                \
                subview2

3 个答案:

答案 0 :(得分:8)

如果没有看到你的视图层次结构,我只能猜测它可能不起作用,因为.intersects比较同一坐标空间中的两个rects,你的视图可能有不同的坐标空间(除非它们是具有相同superview的兄弟姐妹) ,因为.frame总是在你的superview的坐标中)。 UIView有一堆转换方法(你希望convertRect:fromView)将一个点或矩形从一个视图的坐标空间转换为另一个。一旦你在同一坐标空间中有两个rects,就可以使用/ intersects()。

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

答案 1 :(得分:2)

我使用bounds代替frame使其工作。因此,使用subview1.bounds.intersects(subview2.bounds)时,当我将true放到subview1时,它会返回subview2

根据here

  

UIView的界限是矩形,表示为相对于其自身坐标系(0,0)的位置(x,y)和大小(宽度,高度) /强>

     

UIView的框架是矩形,表示为位置(x,y)和尺寸(宽度,高度)相对于超级视图它包含在内

我不确定为什么当两个UIView具有不同的父级时,使用具有相对于其自身坐标的位置和大小的CGRect。如果有人能够解释我的意思,我会接受这个答案。

答案 2 :(得分:0)

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

  • in Xcode run the project
  • 转到debug tab
  • 然后点击view debugging
  • 然后show view frames

您会看到这些视图是否相互交叉?我希望它有所帮助。