3

NSMutableArrayにいくつかのUIImageViewがあります。それらはすべて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
        }
    }
}

元のコードがすべてのオブジェクトを2回チェックしていると考えてください(たとえば、ループの後半で画像ビュー3と5、次に5と3)。

于 2012-10-09T12:31:26.127 に答える