2010-10-20 5 views
2

J'utilise setNeedsDisplayInRect: autant que possible dans ma sous-classe UIView, mais je ne sais pas quoi faire dans drawRect:. Quelle est la meilleure façon de détecter quelles parties de l'UIView doivent être dessinées? En ce moment j'ai divisé mon UIView en plusieurs CGRect. Pour chaque CGRect, j'appelle CGRectContainsRect() pour vérifier si CGRect doit être dessiné ou non. Est-ce la bonne façon, ou existe-t-il un meilleur moyen?Le moyen le plus efficace pour dessiner partiellement un UIView dans drawRect:

+1

On dirait que vous êtes désireux de choses de tuiles, avez-vous regardé l'aide d'un CATiledLayer à la place? Laissez-le faire le carrelage pour vous, et dessinez juste sur le calque. – jer

Répondre

2

Vous recherchez une tâche de partitionnement spatial classique. Selon la complexité de votre vue, vous pouvez utiliser différentes stratégies pour déterminer ce qui doit être dessiné. Si votre scène est très simple, dessiner tout ou partitionner la scène en zones discrètes et faire votre rectangle de délimitation est correct. Pour les scènes très complexes, il existe plusieurs bonnes structures de données (telles que octrees) pour représenter votre scène en tant qu'arbre et effectuer des requêtes spatiales pour les objets dans une région donnée.

Vérifiez le sujet de Cloisonnement Spacial sur Wikipédia: http://en.wikipedia.org/wiki/Space_partitioning

3

Vous voudrez dessiner n'importe quel rect qui est même partiellement dans le rect invalidé, donc vous voudrez utiliser CGRectIntersectsRect(). Cela dit, j'ai vu peu de cas où il est logique de dessiner partiellement des UIViews - à moins d'avoir une très grande vue unique à l'intérieur d'une vue de défilement, vous pouvez tout aussi bien dessiner le tout.

Questions connexes