Когда мне нужно вызвать setNeedsDisplay в iOS?

При создании приложения для iOS я не понимаю, когда именно мне нужно позвонить setNeedsDisplay? Я знаю, что это как-то связано с обновлением / перерисовкой пользовательского интерфейса; однако нужно ли мне вызывать это каждый раз, когда я меняю какое-либо из своих взглядов?

Например, мне нужно назвать это:

  • После программного изменения текста в текстовом поле
  • При изменении фона вида?
  • Когда я вношу изменения в viewDidLoad?
  • Как насчет viewDidAppear?

Может ли кто-нибудь дать мне общие рекомендации относительно того, когда использовать этот метод?


person Nosrettap    schedule 30.05.2012    source источник
comment
Это один из самых ужасных вызовов в вычислительной технике. Его следует просто называть setNeedsDraw. setNeedsLayout помечает макет (ограничения, фреймы), который нужно переделать. setNeedsDraw помечает вызов draw # rect, который нужно повторить. Это так просто.   -  person Fattie    schedule 04.09.2019


Ответы (5)


Вы должны вызывать setNeedsDisplay только в том случае, если вы переопределяете drawRect в подклассе UIView, который в основном представляет собой настраиваемое представление, рисующее что-то на экране, например линии, изображения или формы, такие как прямоугольник.

Таким образом, вы должны вызвать setNeedsDisplay, когда вы вносите изменения в несколько переменных, от которых зависит этот рисунок, и для представления этого изменения вам необходимо вызвать этот метод, который внутренне вызовет drawRect и перерисует компоненты.

Когда вы добавляете imageView или UIButton в качестве подпредставления или вносите изменения в любое подпредставление, вам не нужно вызывать этот метод.

Пример:

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

Теперь в этом случае вы либо измените эти переменные (центр или радиус) в цикле и таймере, либо вы можете вручную в методах touchesEnded и touchesMoved. Чтобы отразить изменение этого свойства, вам необходимо перерисовать это представление, для которого вы вызовете setNeedsDisplay.

person Amogh Talpallikar    schedule 30.05.2012
comment
То же самое после того, как я изменил рамку слоя или представления внутри подкласса представления? - person Van Du Tran; 19.03.2015

Вам действительно нужно вызвать -setNeedsDisplay только в подклассах UIView, которые рисуют свое содержимое с помощью -drawRect:.

Для меток и других стандартных элементов управления изменение текста автоматически приведет к перерисовке метки, поэтому вам не нужно делать это самостоятельно.

person Mike Weller    schedule 30.05.2012

setNeedsDisplay: следует вызывать, когда вы хотите явно обновить представление. Он просто устанавливает внутренний флаг, и система пользовательского интерфейса iOS вызовет drawRect: в подходящее время позже.

Похоже, его всегда следует вызывать при обновлении любого свойства, которое может изменить представление. Но это не так. Почти все стандартные элементы управления пользовательского интерфейса уже справились с этим. Я считаю, что всякий раз, когда вы изменяете свойства стандартных компонентов пользовательского интерфейса (представлений), setNeedsDisplay: будет запускаться внутренне, а затронутая область будет перерисована. (Во всех перечисленных вами ситуациях)

Однако, если вы создаете свое собственное представление, реализуете свое собственное drawRect: и хотите обновить его, когда что-то было изменено, вы должны вызвать setNeedsDisplay: явно.

person Wei Xiang    schedule 30.05.2012

Я думаю, что @Amogh Talpallikar проясняет это. И я просто хочу обсудить еще кое-что.

В том, что вам следует избегать переопределения drawRect, если оно вам действительно не нужно, потому что это может привести к снижению производительности. Вы можете сослаться на этот https://yalantis.com/blog/mastering-uikit-performance/

Если вы хотите изменить только рамку, положение кнопок, меток, ... вы можете вызвать setNeedLayout или layoutIfNeeded

person Proton    schedule 29.06.2016

Вы вызовете setNeedDisplay при изменении свойства, от которого зависит пользовательский чертеж вашего вида. Он принудительно вызовет метод drawRect :.

person SuryaKantSharma    schedule 01.04.2017