检测一个视图的点是否在另一个视图内时的最佳选择?
Best choice when detecting whether a view's point is inside another view?
所以我找到了 3 种方法来实现这一目标。
convertPoint:toView:
convertPoint:fromView:
convertRect:toView:
convertRect:fromView:
Bool CGRectContainsPoint(CGRect rect, CGPoint point);
BOOL isPointInsideView = [aView pointInside:aPoint withEvent:nil];
他们似乎都在做同样的事情,但我可能是错的。你检查一个点是否在某个视图内考虑它的框架然后得到 true 或 false。
我最终使用其中的哪一个并不重要,或者我应该注意可能出现的问题吗?
你应该知道每个方法的用途:
point
| A point that is in the receiver’s local coordinate system (bounds
).
除此之外,该方法可能只是简单地用传递的点和边界框调用 CGRectContainsPoint
。
CGRectContainsPoint
只是根据 origin
和 size
计算检查 x
和 y
坐标。简单的数学运算,但再次必须在同一坐标系中,因为矩形和点都不包含关于它们各自坐标系的任何信息,它们是绝对值。
convert*
函数提供了将相对于接收者坐标系的CGPoint转换成其他相对坐标系的能力。
要了解每种方法的用途,您必须了解不同的 CGRect
的含义,特别是 frame
和 bounds
:this answer 是 THE这样做的方式。
了解不同属性的含义后,应该很容易选择正确的函数。
TL;DR:convert*
方法为您提供了在坐标系之间转换 CGPoint
s 的能力。其他两个选项在一个特定的固定坐标系内运行。根据您的具体情况选择您需要的是您的工作。
例如,您可能必须先变换一个点,然后再执行命中检测。
所以我找到了 3 种方法来实现这一目标。
convertPoint:toView:
convertPoint:fromView:
convertRect:toView:
convertRect:fromView:
Bool CGRectContainsPoint(CGRect rect, CGPoint point);
BOOL isPointInsideView = [aView pointInside:aPoint withEvent:nil];
他们似乎都在做同样的事情,但我可能是错的。你检查一个点是否在某个视图内考虑它的框架然后得到 true 或 false。
我最终使用其中的哪一个并不重要,或者我应该注意可能出现的问题吗?
你应该知道每个方法的用途:
point
| A point that is in the receiver’s local coordinate system (bounds
).
除此之外,该方法可能只是简单地用传递的点和边界框调用 CGRectContainsPoint
。
CGRectContainsPoint
只是根据 origin
和 size
计算检查 x
和 y
坐标。简单的数学运算,但再次必须在同一坐标系中,因为矩形和点都不包含关于它们各自坐标系的任何信息,它们是绝对值。
convert*
函数提供了将相对于接收者坐标系的CGPoint转换成其他相对坐标系的能力。
要了解每种方法的用途,您必须了解不同的 CGRect
的含义,特别是 frame
和 bounds
:this answer 是 THE这样做的方式。
了解不同属性的含义后,应该很容易选择正确的函数。
TL;DR:convert*
方法为您提供了在坐标系之间转换 CGPoint
s 的能力。其他两个选项在一个特定的固定坐标系内运行。根据您的具体情况选择您需要的是您的工作。
例如,您可能必须先变换一个点,然后再执行命中检测。