什么是检查两个或更多CGRects在NSMutableArray中时是否触摸的好方法?

时间:2012-10-09 12:22:48

标签: objective-c ios xcode uiimageview intersection

我在NSMutableArray中有几个UIImageViews。它们都在superView中。我想检查UIImageView是否与数组中的另一个UIImageView相交(碰撞,碰撞或触摸)。这就是我一直在做的事情,但我认为应该有更好的方法。

for (UIImageView *b in _blocks) {
    for (UIImageView *b2 in _blocks) {
        if (CGRectContainsPoint(b2.frame, CGPointMake(b.center.x, b.center.y + b.frame.size.height/2))) {
            // Do something
        }

    }

}

如果我想检查图像视图是否以这种方式触摸超过2个视图,则代码将变得非常讨厌。这就是为什么我想知道更好的方法。

3 个答案:

答案 0 :(得分:1)

使用:CGRectIntersectsRect(b2.frame, b.frame)

如下:

for (UIImageView *b in _blocks) {
    for (UIImageView *b2 in _blocks) {
         if (b != b2 && CGRectIntersectsRect(b2.frame, b.frame)) {
            // Do something
        }

    }
}

答案 1 :(得分:1)

这样做:

 NSMutableArray *arrIntersect = [NSMutableArray array];
 for (UIImageView *b in _blocks) {
    for (UIImageView *b2 in _blocks) {
         if (b != b2 && CGRectIntersectsRect(b2.frame, b.frame)) {
            if(arrIntersect.count > 2)
               //count > 2
            else
               [arrIntersect addObject:b2];
        }
    }
}

答案 2 :(得分:0)

我认为你有正确的方法,但是你正在重复检查,所以最好检查一个循环:

NSInteger count = [_blocks count];
for (NSInteger i = 0; i < count - 1; i++)
{
    for (NSInteger j = i + 1; j < count; j++)
    {
        UIImageView *iv1 = [_blocks objectAtIndex:i];
        UIImageView *iv2 = [_blocks objectAtIndex:j];
        if (CGRectIntersectsRect(iv1.frame, iv2.frame)
        {
            // Do something
        }
    }
}

考虑原始代码检查所有对象两次(例如图像视图3和5,然后循环中的5和3)。