Вопрос по swift, objective-c, uiview, ios, setneedsdisplay – Когда мне нужно вызвать setNeedsDisplay в iOS?

61

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

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

After programatically changing the text in a text field When changing the background of a view? When I make changes in viewDidLoad? How about in viewDidAppear?

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

Ваш Ответ

5   ответов
124

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

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

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

Example:

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

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

То же самое после того, как я изменил кадр слоя или представления внутри моего подкласса представления?
10

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

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

1

@Amogh Talpallikar прояснить. И я просто хочу обсудить еще одну вещь.

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

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

5

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

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

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

1

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

Похожие вопросы