Как я могу быстро определить все подвиды (UIViews), которые пересекаются с прямоугольником?

У меня есть представление, которое содержит кучу подпредставлений. Если пользователь коснется и перетащит прямоугольник выбора вокруг некоторых подпредставлений, есть ли более быстрый способ определить, какие подпредставления пересекаются с прямоугольником выбора, кроме итерации по всем подпредставлениям основного родителя?

Мое решение работает, перебирая каждое подпредставление и используя CGRectIntersectsRect(selectionRect, aSubview.frame), но, на мой взгляд, оно слишком медленное.


person jhawne    schedule 27.03.2012    source источник


Ответы (1)


Краткий ответ: нет. Длинный ответ: это в основном потому, что frame является вычисляемым свойством, функцией bounds, center и transform. Даже простое тестирование на попадание основано на итерации.

Настоящий вопрос заключается в том, почему вы думаете, что это слишком медленно. Если у вас есть сотни представлений, то я предлагаю кэшировать кадры представлений, скажем, в touchesBegan:withEvent:, чтобы сэкономить на вычислениях кадров, а сообщение Objective-C отправляет каждый раз, когда вам нужно проверить пересечение (по мере того, как вы перетаскиваете палец).

Возможно, вы также можете применить некоторые приемы оптимизации, такие как сортировка представлений по их происхождению фреймов, но это усложнит ваш код.

person Costique    schedule 27.03.2012
comment
да, я, вероятно, реализую какую-то опцию кэширования, поскольку подвиды добавляются к основному виду. Я думаю, что смогу заставить его работать немного быстрее, если я каким-то образом сохраню их в NSDictionary / NSSet для поиска. Спасибо за дополнительную информацию. - person jhawne; 27.03.2012