0

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

//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)

4

2 回答 2

1

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

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

如果确实如此,那么在这个问题上已经完成了大量的算法工作,可以概括为将数据预处理成允许更便宜的初始测试拒绝远处物体的结构。 这是关于这个主题的一个很好的答案,参考这篇文章

于 2013-04-29T15:57:03.180 回答
0

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

bool CGRectIntersectsRect (
   CGRect rect1,
   CGRect rect2
);

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

于 2013-04-29T15:56:46.387 回答