CGRectContainsPoint 不适用于不同的视图

CGRectContainsPoint does not work on different views

我正在制作一个简单的拖放项目。当我使用 CGRectContainsPoint 将视图拖放到不同的视图时,它会起作用。但是这两个视图应该在同一个视图中。现在假设我有一个名为 "A" 的视图,它包含两个视图。一个 UIView 和一个 UIStackView。如果我将 Stack View 内的视图拖到 UIView,它不会掉落。简单地 CGRectContainsPoint 不适用于从不同视图拖放。有什么办法解决吗?

由于每个视图都有自己的坐标系,因此在比较它们之前必须将所有坐标转换为相同的坐标系(例如 CGRectContainsPoint。并且您需要了解每个点或矩形,在给出的是什么坐标系。Apple 总是在文档中指定它。

作为公共坐标系,选择公共父坐标系或 windows。

在你的例子中,你比较视图的中心是否位于另一个视图的边界内。所以选择一个共同的父视图作为参考坐标系,例如视图控制器主视图:

在Swift中:

let referenceView = self.view // assuming self is the view controller
let dropArea = referenceView.convertRect(self.dropAreaView1.bounds, fromView: self.dropAreaView1)
let center = referenceView.convertPoint(sender.view!.center, fromView: sender.view!.superview)
if CGRectContainsPoint(dropArea, center) {
   // do something
}

请注意,frame 指定了父视图坐标系中的边界。因此,我将其更改为 bounds,它在视图的 onw 坐标系中指定它。此外,center 使用超级视图的坐标系。因此,我将点从超级视图的系统转换为参考视图的系统。