3

我在 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 个视图,代码会变得非常讨厌。这就是为什么我想知道一个更好的方法来做到这一点。

4

3 回答 3

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
        }

    }
}
于 2012-10-09T12:29:47.807 回答
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];
        }
    }
}
于 2012-10-09T12:32:10.583 回答
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)。

于 2012-10-09T12:31:26.127 回答