Какой хороший способ проверить, касаются ли два или более CGRect, когда они находятся в NSMutableArray?

У меня есть несколько UIImageViews в NSMutableArray. Они все в супервиде. Я хочу проверить, пересекает ли 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 ответа

Решение

Сделай это:

 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];
        }
    }
}

Используйте: 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
        }

    }
}

Я думаю, что у вас правильный подход, однако вы дублируете проверку, и поэтому, вероятно, лучше проверить в одном цикле:

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 позже в цикле).

Другие вопросы по тегам