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

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

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

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

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

Ответ 1

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

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

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

Пример:

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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