在iOS中检测拖动时的碰撞

时间:2012-11-03 18:11:33

标签: iphone ios uiview draggable collision-detection

给定一个可以拖动视图的视图层次结构,检测拖动视图和其他视图之间碰撞的最有效方法是什么?

这将是蛮力方法(伪代码):

- (void) onDrag 
{
    CGRect absoluteDraggedViewRect; // Calculate
    for (UIView *otherView in hierarchy)
    {
        CGRect absoluteOtherViewRect; // Calculate
        if (CGRectIntersectsRect(absoluteDraggedViewRect, absoluteOtherViewRect))
        {
            // Collision!
        }
    }
}

您如何改进上述代码?

1 个答案:

答案 0 :(得分:2)

我认为此时唯一的“可见”改进是添加:

if (otherView == self)
    continue;
你的循环中的

。当然,只有self中有hierarchy

最后,如果每个视图与拖动的视图相交,则必须检查每个视图。如果您后来意识到这是一个重要的性能问题,您可以尝试分散工作负载。您可以将“移动区域”划分为多个部分。拖动视图后,您可以计算它与哪些部分相交并保存字典或其他适当的数据结构,并在每个部分中包含所有视图。然后,您只需循环浏览拖动视图的各个部分的视图。但如果这种回报取决于您的具体用例。如果您当前的方法证明是性能问题,我只会考虑它。

唐纳德克努特曾说过:

  

“我们应该忘记效率低,大约97%的时间说:   过早优化是所有邪恶的根源“