Я не могу найти достойный ответ, чтобы объяснить мне разницу между этими двумя функциями. когда каждый вызывает вызов, и как он отличается от другого?
например, не могу ли я просто разместить мои представления внутри drawrect?
Спасибо
Я не могу найти достойный ответ, чтобы объяснить мне разницу между этими двумя функциями. когда каждый вызывает вызов, и как он отличается от другого?
например, не могу ли я просто разместить мои представления внутри drawrect?
Спасибо
-layoutSubviews вызывается из -layoutIfNeeded, если был установлен флаг "Необходимый макет" (с использованием -setNeedsLayout или автоматически при изменении границ представления). Используйте его для позиционирования вашего представления [ EDIT: Используйте его для позиционирования подпунктов].
-drawRect: вызывается из -displayIfNeeded, если установлен флаг "display needed" (с помощью -setNeedsDisplay или автоматически, если вы установили view.contentMode = UIViewContentModeRedraw).
Оба -layoutIfNeeded и -displayIfNeeded вызываются автоматически с помощью UIKit/CoreAnimation, прежде чем все рисуется на экране; вам редко нужно называть их напрямую.
Вы можете позиционировать свои подпрограммы в -drawRect: (вы даже можете добавить subviews!), но это неразумно:
-setNeedsDisplay не вызывается автоматически при изменении границ.-drawRect: снижает производительность (UIKit/CoreAnimation должен создать для вас графический контекст с поддержкой растровой графики); сделайте это только в том случае, если вам нужно выполнить пользовательский чертеж.-drawRect:. Рисование дорого. Перемещение просмотров вокруг дешево.EDIT: И еще несколько подробностей, когда я проснулся:
В чем разница между "отображением" и "рисованием"? Отображение выполняется с помощью -[CALayer display]; реализация по умолчанию (приблизительно)
-displayLayer:, вызовите [self.delegate displayLayer:self]. -displayLayer: должен установить layer.content в (например) CGImage,-drawLayer:inContext:, настройте контекст с поддержкой bitmap, вызовите [self.delegate drawLayer:self inContext:context] и сохраните вывод в layer.content (вывод на самом деле является CABackingStore, который предположительно является частным API )layer.content.Представление представляет собой делегат слоя, поэтому вы можете реализовать -[MyView displayLayer:] вместо этого и делать интересные вещи, например
self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage) (что примерно соответствует UIImageView)Может быть, у меня нет всех ответов, но могу сказать вам, что: - layoutSubviews вызывается при изменении рамки представления - drawRect вызывается, когда setNeedDisplay вызывается
В большинстве случаев вы не будете использовать layoutSubviews.
Могут быть и другие случаи, но это может дать вам первый ответ: ^^
Удачи.