在使用UIGesturerescognizer或其他方式移动时,如何知道子视图是否相交?

时间:2013-04-29 15:41:28

标签: ios objective-c uiview uigesturerecognizer

在我的应用程序中,我有很多UIButtons动态添加到View中,我使用下面的方法 将它们拖到视图周​​围。

//forDragAction
 [btnTarget addTarget:self action:@selector(wasDragged:withEvent:)
                forControlEvents:UIControlEventTouchDragInside];

- (void)wasDragged:(UIButton *)button withEvent:(UIEvent *)event
{
    // get the touch
    UITouch *touch = [[event touchesForView:button] anyObject];

    // get delta
    CGPoint previousLocation = [touch previousLocationInView:button];
       // frameof buttonChanged here
}

我想停止拖动动作如果被拖动的动作与任何其他动画相交,我知道我可以使用for循环来检查是否有任何UIButton正在交互

for(UIButton *btn in [[button superview] subViews])
{
    //check if the btn frame interact with any others if so comeout of loop
}

我想知道是否还有其他方法,如果subViews计数增加到如此大的数量,提到的方式会变慢

编辑: - UIButtons动态添加到UIView(但子视图的总量不会超过120)

2 个答案:

答案 0 :(得分:1)

先尝试蛮力。你可能会对它的表现感到惊讶。 (但请记住,通过[[button superview] subviews]的循环将包含按钮本身,因此它将始终停止,因为按钮与自身相交。确保排除按钮。)

在您使用真实数据显然运行缓慢的工作后进行优化。

如果确实如此,那么就会对这个问题进行大量的算法工作,这可以概括为将数据预处理成允许更便宜的初始测试拒绝远程对象的结构。关于该主题的This is a good SO answer,指的是this article

答案 1 :(得分:0)

我认为可能填满屏幕(没有交叉点)的子视图数量太大。所以使用功能:

bool CGRectIntersectsRect (
   CGRect rect1,
   CGRect rect2
);

用于检测拖动按钮的帧是否与另一个子视图相交。