【问题标题】:Detecting collisions on drag in iOS在 iOS 中检测拖动碰撞
【发布时间】:2012-10-24 02:29:51
【问题描述】:

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

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

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

你会如何改进上面的代码?

【问题讨论】:

    标签: iphone ios uiview draggable collision-detection


    【解决方案1】:

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

    if (otherView == self)
        continue;
    

    在你的循环中。当然,前提是self 在hierarchy 中。

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

    正如 Donald Knuth 曾经说过的:

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

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多