2010-05-29 4 views
0

Lors de la programmation de mon application, j'arrive au point où je dois mettre à jour deux rectangles sur l'écran. J'appelle donc [self setNeedsDisplayInRect: rect1] puis [self setNeedsDisplayInRect: rect2]. Lorsque ma méthode drawRect est appelée, le paramètre rectangle est le plus petit rectangle qui contient à la fois rect1 et rect2.Comment arrêter setNeedsDisplayInRect/drawRect coalescence?

Je peux gérer cela sans problème, mais quand les deux rectangles sont éloignés, alors je mets à jour beaucoup de biens immobiliers sans aucun gain. Dans ce cas, je voudrais juste repeindre mes deux petits rectangles. Donc, ma question est comment puis-je empêcher le système sous-jacent de fusionner mes deux appels en un seul?

Répondre

0

Vous n'avez pas besoin d'empêcher le système de fusionner les appels car, en -drawRect:, vous pouvez interroger les régions individuelles qui doivent être mises à jour en appelant -getRectsBeingDrawn:count:. Cela renverra vos rectangles individuels rect1 et rect2.

Notez que -getRectsBeingDrawn:count: est garanti pour renvoyer des rectangles ne se chevauchant pas. Cela semble impliquer que si, par exemple, vous appeliez deux fois -setNeedsDisplayInRect: pour le même rectangle, -getRectsBeingDrawn:count: ne retournerait ce rectangle qu'une seule fois. En d'autres termes, vous n'avez pas besoin de craindre de dessiner deux fois la même région.

+0

Je ne vois pas comment passer d'un UIView à un NSView. Quel est le lien là-bas? –

+0

@Non One en particulier: Vous ne pouvez pas - 'UIView' est l'équivalent iOS (ou plutôt UIKit) de Mac OS (ou plutôt AppKit)' NSView'. Et malheureusement, 'UIView' ne semble pas avoir' -getRectsBeingDrawn: count: '... –

+0

Bien que répondu par la négative, il est le plus instructif. Je vais accepter celui-ci puisque personne n'a une meilleure idée. Merci Martin. –