web-dev-qa-db-fra.com

Quand dois-je appeler setNeedsDisplay dans iOS?

Lors de la création d'une application iOS, je ne sais pas exactement quand j'ai besoin d'appeler setNeedsDisplay? Je sais que cela a quelque chose à voir avec la mise à jour/redessiner l'interface utilisateur; Cependant, dois-je l'appeler chaque fois que je change de vue?

Par exemple, dois-je l'appeler:

  • Après avoir modifié par programme le texte d'un champ de texte
  • Lorsque vous modifiez l'arrière-plan d'une vue?
  • Quand j'apporte des modifications à viewDidLoad?
  • Que diriez-vous de viewDidAppear?

Quelqu'un pourrait-il me donner des directives générales sur le moment d'utiliser cette méthode?

62
Nosrettap

Vous ne devez appeler setNeedsDisplay que si vous remplacez drawRect dans une sous-classe d'UIView qui est essentiellement une vue personnalisée dessinant quelque chose à l'écran, comme des lignes, des images ou des formes comme 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, appellera drawRect et redessinera les composants.

Lorsque vous ajoutez une imageView ou un UIButton en tant que sous-vue ou apportez des modifications à une sous-vue, vous n'avez pas besoin d'appeler cette méthode.

Exemple:

Vous avez une vue qui montre un cercle en mouvement, soit vous le touchez et le déplacez, soit une animation basée sur une minuterie. Maintenant, pour cela, vous aurez besoin d'une vue personnalisée qui dessine un cercle au centre donné et avec un rayon donné. Celles-ci sont conservées en tant que variables d'instance qui sont modifiées pour déplacer le cercle en changeant son centre ou l'agrandir en augmentant son rayon.

Maintenant, dans ce cas, vous allez modifier ces variables (centre ou rayon) dans une boucle et une minuterie Ou peut-être par vos doigts dans les méthodes touchesEnded et touchesMoved. Pour refléter la modification de cette propriété, vous devez redessiner cette vue pour laquelle vous appellerez setNeedsDisplay.

126

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

Pour les étiquettes et autres contrôles standard, la modification du texte entraînera automatiquement le redessin de l'étiquette, vous n'avez donc pas besoin de le faire vous-même.

11
Mike Weller

setNeedsDisplay: doit être appelé lorsque vous souhaitez actualiser explicitement votre vue. Il définit simplement un indicateur interne et le système d'interface utilisateur 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 modifier la présentation. Mais ce n'est pas. Presque tous les contrôles d'interface utilisateur standard ont déjà géré cela. Je crois que chaque fois que vous modifiez les propriétés des composants d'interface utilisateur standard (vues), setNeedsDisplay: serait déclenché en interne et la région affectée sera 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 que vous souhaitez mettre à jour que lorsque quelque chose a été changé, vous devez appeler setNeedsDisplay: explicitement.

5
Wei Xiang

Je pense qu'Amogh Talpallikar est clair. Et je veux juste discuter d'une chose de plus.

Dans le fait, vous devez éviter de remplacer drawRect sauf si vous en avez vraiment besoin car cela peut entraîner de mauvaises performances. Vous pouvez référer cela https://yalantis.com/blog/mastering-uikit-performance/

Si vous ne voulez changer que le cadre, la position des boutons, les étiquettes, ... vous pouvez appeler setNeedLayout ou layoutIfNeeded

2
Proton

Vous appellerez setNeedsDisplay lorsque vous modifiez la propriété dont dépend le dessin personnalisé de votre vue. Il appellera explicitement la méthode drawRect: avec force.

1
SuryaKantSharma