1

给定可以拖动视图的视图层次结构,检测被拖动视图与其他视图之间的冲突的最有效方法是什么?

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

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

您将如何改进上述代码?

4

1 回答 1

2

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

if (otherView == self)
    continue;

在你的循环中。当然只有selfhierarchy.

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

正如唐纳德·高德纳 (Donald Knuth) 曾经说过的:

“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源”

于 2012-11-03T18:37:13.363 回答