给定一个可以拖动视图的视图层次结构,检测拖动视图和其他视图之间碰撞的最有效方法是什么?
这将是蛮力方法(伪代码):
- (void) onDrag
{
CGRect absoluteDraggedViewRect; // Calculate
for (UIView *otherView in hierarchy)
{
CGRect absoluteOtherViewRect; // Calculate
if (CGRectIntersectsRect(absoluteDraggedViewRect, absoluteOtherViewRect))
{
// Collision!
}
}
}
您如何改进上述代码?
答案 0 :(得分:2)
我认为此时唯一的“可见”改进是添加:
if (otherView == self)
continue;
你的循环中的。当然,只有self
中有hierarchy
。
最后,如果每个视图与拖动的视图相交,则必须检查每个视图。如果您后来意识到这是一个重要的性能问题,您可以尝试分散工作负载。您可以将“移动区域”划分为多个部分。拖动视图后,您可以计算它与哪些部分相交并保存字典或其他适当的数据结构,并在每个部分中包含所有视图。然后,您只需循环浏览拖动视图的各个部分的视图。但如果这种回报取决于您的具体用例。如果您当前的方法证明是性能问题,我只会考虑它。
唐纳德克努特曾说过:
“我们应该忘记效率低,大约97%的时间说: 过早优化是所有邪恶的根源“