【问题标题】:Best choice when detecting whether a view's point is inside another view?检测一个视图的点是否在另一个视图内时的最佳选择?
【发布时间】:2015-12-26 11:20:24
【问题描述】:

所以我找到了 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];

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

我最终使用哪一个无关紧要,还是我应该意识到可能出现的问题..?

【问题讨论】:

    标签: ios objective-c uiview cgrect cgpoint


    【解决方案1】:

    您应该了解每种方法的用途:

    pointInside:withEvent: 的文档说

    point |接收器本地坐标系中的一个点 (bounds)。

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

    CGRectContainsPoint 只是根据originsize 检查xy 坐标。简单的数学运算,但同样,两者都必须在同一个坐标系中,因为 rect 和 point 都不包含有关其各自坐标系的任何信息,它们是绝对值。

    convert* 函数使您能够将相对于接收器坐标系的 CGPoint 转换为其他相对坐标系。

    要了解每种方法的优点,您必须了解 CGRects 的不同含义,尤其是 frameboundsthis answer 是实现这一目标的方法。

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

    TL;DR:convert* 方法让您能够在坐标系之间转换CGPoints。其他两个选项在一个特定的固定坐标系内运行。在您的特定情况下选择您需要的那个是您的工作。

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

    【讨论】:

    • 好的,例如,通过使用 panGesture,我将一个视图滑动到另一个视图上,而不是在它们相交时,而是当滑动视图的中心点与另一个视图的边界相交时,我想触发委托/方法.在这种情况下......你会选择哪一个?
    • @durazno 我会说你获得了滑动视图的中心,通过convertPoint:toView: 对其进行转换,然后调用pointInside。第一个调用滑动视图,第二个调用要检查交叉点
    • 为什么我不能直接调用 CGRectContainsPoint?那不是得到滑动视图的中心点然后检查另一个视图是否包含该点吗?
    • @durazno 它可能工作。但是问题是slidingView的中心点不能保证和toCheckForView的中心点在同一个坐标空间。还有一个棘手的问题:center 属性位于 superViews 坐标空间中,因此您必须在 slidingView 的父视图上调用 convertPoint:toView:。如果slidingViewtoCheckForView 在同一个父视图中,那么 CGRectContainsPoint 可以工作。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多