检测一个视图的点是否在另一个视图内时的最佳选择?

Best choice when detecting whether a view's point is inside another view?

所以我找到了 3 种方法来实现这一目标。

  1. convertPoint:toView: convertPoint:fromView: convertRect:toView: convertRect:fromView:

  2. Bool CGRectContainsPoint(CGRect rect, CGPoint point);

  3. BOOL isPointInsideView = [aView pointInside:aPoint withEvent:nil];

他们似乎都在做同样的事情,但我可能是错的。你检查一个点是否在某个视图内考虑它的框架然后得到 true 或 false。

我最终使用其中的哪一个并不重要,或者我应该注意可能出现的问题吗?

你应该知道每个方法的用途:

pointInside:withEvent: 的文档说

point | A point that is in the receiver’s local coordinate system (bounds).

除此之外,该方法可能只是简单地用传递的点和边界框调用 CGRectContainsPoint

CGRectContainsPoint 只是根据 originsize 计算检查 xy 坐标。简单的数学运算,但再次必须在同一坐标系中,因为矩形和点都不包含关于它们各自坐标系的任何信息,它们是绝对值。

convert*函数提供了将相对于接收者坐标系的CGPoint转换成其他相对坐标系的能力。

要了解每种方法的用途,您必须了解不同的 CGRect 的含义,特别是 frameboundsthis answer 是 THE这样做的方式。

了解不同属性的含义后,应该很容易选择正确的函数。

TL;DR:convert* 方法为您提供了在坐标系之间转换 CGPoints 的能力。其他两个选项在一个特定的固定坐标系内运行。根据您的具体情况选择您需要的是您的工作。

例如,您可能必须先变换一个点,然后再执行命中检测。