Какой хороший способ проверить, касаются ли два или более 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 позже в цикле).