65 votes

Quand dois-je appeler setNeedsDisplay dans iOS ?

Lors de la création d'une application iPhone/iPad, je ne sais pas exactement à quel moment je dois appeler setNeedsDisplay ? Je sais que cela a quelque chose à voir avec la mise à jour/le redessin de l'interface utilisateur ; cependant, dois-je l'appeler chaque fois que je modifie l'une de mes vues ?

Par exemple, dois-je l'appeler :

  • Après avoir modifié par programme le texte d'un champ de texte
  • Lors de la modification de l'arrière-plan d'une vue ?
  • Lorsque je fais des changements dans viewDidLoad ?
  • Et dans viewDidAppear ?

Quelqu'un pourrait-il me donner des indications générales sur le moment où il convient d'utiliser cette méthode ? Merci

128voto

Amogh Talpallikar Points 4234

Vous ne devriez appeler setNeedsDisplay que si vous surchargez drawRect dans une sous-classe de UIView, qui est en fait une vue personnalisée dessinant quelque chose à l'écran, comme des lignes, une image ou un rectangle.

Vous devez donc appeler setNeedsDisplay lorsque vous apportez des modifications à quelques variables dont dépend ce dessin et pour que la vue représente ce changement, vous devez appeler cette méthode qui, en interne, donnera un appel à drawRect et redessinera les composants.

Lorsque vous ajoutez une imageView ou un UIButton en tant que sous-vue ou que vous apportez des modifications à une sous-vue, vous ne devez pas appeler cette méthode.

Exemple :

Vous avez une vue qui montre un cercle en mouvement, soit que vous le touchez et le déplacez, ou peut être une animation basée sur un minuteur. Pour cela, vous aurez besoin d'une vue personnalisée qui dessine un cercle à un centre donné et avec un rayon donné. Ceux-ci sont conservés comme variables d'instance qui sont modifiées pour déplacer le cercle en changeant son centre ou le rendre plus grand en augmentant son rayon.

Dans ce cas, vous pouvez soit modifier ces variables (centre ou rayon) dans une boucle et une minuterie, soit utiliser vos doigts dans les méthodes touchesEnded et touchesMoved. Pour refléter le changement dans cette propriété, vous devez redessiner cette vue pour laquelle vous appelez setNeedsDisplay.

11voto

Mike Weller Points 28387

Vous n'avez besoin que d'appeler -setNeedsDisplay sur les sous-classes de UIView qui dessinent leur contenu avec -drawRect: .

Pour les étiquettes et les autres contrôles standard, la modification du texte entraîne automatiquement la redéfinition de l'étiquette, ce qui vous évite d'avoir à le faire vous-même.

5voto

Wei Xiang Points 184

setNeedsDisplay: doit être appelé lorsque vous souhaitez rafraîchir votre vue de manière explicite. Il suffit d'activer un drapeau interne, et le système d'interface utilisateur d'iOS appellera drawRect: à un moment approprié plus tard.

Il semble qu'il devrait toujours être appelé lorsque vous mettez à jour une propriété qui peut changer la présentation. Mais ce n'est pas le cas. Presque tous les contrôles standard de l'interface utilisateur gèrent déjà cela. Je crois que lorsque vous modifiez les propriétés des composants standard de l'interface utilisateur (vues), setNeedsDisplay: serait déclenché en interne, et la région concernée serait redessinée. (Dans toutes les situations que vous avez énumérées)

Cependant, si vous créez votre propre vue, implémentez sa propre drawRect: et vous voulez mettre à jour que lorsque quelque chose a été changé, vous devez appeler setNeedsDisplay: explicitement.

3voto

Proton Points 865

Je pense que @Amogh Talpallikar a été clair. Et je veux juste discuter d'une chose de plus.

Dans le fait que, vous devriez éviter d'écraser drawRect sauf si vous en avez vraiment besoin, car cela peut entraîner de mauvaises performances. Vous pouvez vous référer à ce qui suit https://yalantis.com/blog/mastering-uikit-performance/

Si vous voulez seulement changer le cadre, la position des boutons, les étiquettes, ... vous pouvez appeler setNeedLayout o layoutIfNeeded

1voto

SuryaKantSharma Points 347

Vous appellerez setNeedDisplay lorsque vous modifierez la propriété dont dépend le dessin personnalisé de votre vue. Il appellera explicitement la méthode drawRect : de manière forcée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X