在 iOS 中检测拖动碰撞

Posted

技术标签:

【中文标题】在 iOS 中检测拖动碰撞【英文标题】:Detecting collisions on drag in 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!
        
    

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

【问题讨论】:

【参考方案1】:

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

if (otherView == self)
    continue;

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

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

正如 Donald Knuth 曾经说过的:

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

【讨论】:

以上是关于在 iOS 中检测拖动碰撞的主要内容,如果未能解决你的问题,请参考以下文章

带有碰撞检测的 jQuery 拖动

动力学js中的碰撞检测+鼠标事件

请推荐一个处理可拖动元素的碰撞检测的 JQuery 插件 [关闭]

视图的图像在 iOS Swift 中不会相互碰撞?

actionscript 2 碰撞检测

cocos2dx 3.x(精灵的碰撞检测,点击移动与拖动精灵)