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



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



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




  • после программного изменения текста в текстовом поле

  • при изменении фона вида?

  • когда я делаю изменения в viewDidLoad?

  • как в viewDidAppear?


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

833   5  

5 ответов:

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

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

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

пример:

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.