Когда мне нужно вызвать 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.