Question

Je souhaite créer une NSView personnalisée qui adopte une approche de peinture par couches. J'imagine que la majorité des couches auraient la même largeur et la même hauteur que la vue de fond.

Est-il approprié d’utiliser les classes Core Animation telles que CALayer pour cette tâche, même si je ne pense pas avoir besoin de beaucoup d’animation? Existe-t-il une approche plus appropriée?

Pour clarifier, la vue ne doit pas ressembler à une zone de travail dans une application semblable à Photoshop. Il s’agit plutôt d’un affichage de données qui devrait permettre l’interaction de l’utilisateur (sélection, déplacement, défilement, etc.)

Était-ce utile?

La solution

Si vous êtes intéressé par l'affichage et la mise en page, je dirais qu'une architecture basée sur CALayer est un bon choix. Pour le Framework Core Plot open source , nous construisons tous nos graphiques et éléments de tracé. sur CALayers, et les organiser dans une hiérarchie régulière. Les CALayers sont légers et utilisent des API presque identiques entre Mac et iPhone. Ils peuvent même être amenés à réagir à des événements tactiles ou à la souris.

Pour un autre exemple d'interface utilisateur basée sur CALayer, l'entrée complète de l'équation de mon application iPhone L’interface est composée de CALayers, y compris le menu qui glisse vers le haut. Les performances sont légèrement meilleures que celles de mon implémentation précédente basée sur UIView, mais le même code fonctionne également dans ma version de bureau préliminaire de l'application.

Autres conseils

Pour un programme de dessin, j'imagine qu'il serait important de conserver un tampon des données bitmap. Le seul problème lié à l'utilisation d'une CALayer est que la propriété contents est un CGImageRef . Réactiver cela dans un contexte graphique pour continuer à dessiner peut être un peu pénible. Vous devez initialiser un nouveau contexte, dessiner les données bitmap dans celui-ci, puis effectuer les opérations de dessin souhaitées et enfin les reconvertir en CGImageRef . Vous ne pourrez probablement pas éviter un nombre d'allocation de mémoire assez important, ce qui est pratiquement garanti pour ralentir votre programme.

J'envisagerais de créer un tampon hors écran pour chaque couche. Jetez un coup d'œil à l'objet CGLayerRef de Quartz. Je pense que cela fait probablement ce que vous voulez faire: c'est un tampon hors écran qui contient tout ce que vous voudrez dessiner à plusieurs reprises. Vous pouvez également obtenir rapidement un CGContextRef chaque fois que vous en avez besoin afin de pouvoir effectuer des dessins supplémentaires. Et vous pouvez toujours utiliser ce CGContextRef avec NSGraphicsContext si vous souhaitez utiliser les méthodes de dessin Cocoa.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top