Самый эффективный способ частичного рисования UIView в drawRect:

Я максимально использую setNeedsDisplayInRect: в своем подклассе UIView, но не знаю, что делать в drawRect:. Как лучше всего определить, какие части UIView нужно нарисовать? Прямо сейчас я разделил свой UIView на несколько CGRect. Для каждого CGRect я звоню CGRectContainsRect(), чтобы проверить, нужно ли рисовать этот CGRect. Это правильный способ или есть лучший способ?


person Rits    schedule 20.10.2010    source источник
comment
Похоже, вы хотите расположить элементы мозаикой, не рассматривали ли вы использование CATiledLayer вместо этого? Позвольте ему укладывать плитку за вас и просто нарисуйте слой.   -  person jer    schedule 20.10.2010


Ответы (2)


Перед вами классическая задача пространственного разделения. В зависимости от сложности вашего представления вы можете использовать разные стратегии, чтобы определить, что нужно нарисовать. Если ваша сцена очень проста, то рисование всего или разбиение сцены на отдельные области и проверка ограничивающего прямоугольника - это нормально. Для очень сложных сцен существует несколько хороших структур данных (таких как октодеревья) для представления вашей сцены в виде дерева и выполнения пространственных запросов для объектов в заданной области.

Ознакомьтесь с темой пространственного разбиения в Википедии: http://en.wikipedia.org/wiki/Space_partitioning

person Tim Rupe    schedule 20.10.2010

Вы захотите нарисовать любой прямоугольник, который хотя бы частично находится в недействительном прямоугольнике, поэтому вы захотите использовать CGRectIntersectsRect(). Сказав это, я видел несколько случаев, когда имеет смысл частично рисовать UIViews - если у вас нет очень большого одиночного представления внутри представления прокрутки, вы также можете нарисовать его целиком.

person Daniel Dickison    schedule 20.10.2010