2010-02-24 4 views
0

dans mon application Je veux avoir une table lumineuse pour trier les photos. Fondamentalement, c'est juste une vue énorme avec beaucoup de photos et vous pouvez faire glisser les photos. Les photos peuvent se chevaucher, elles ne tombent pas dans une grille comme dans iPhoto.Aide sur Cocoa: les objets en tant que vues?

Chaque photo doit donc répondre aux événements de la souris. Est-ce que je fais chaque photo dans sa propre vue? Ou les vues sont-elles trop chères à créer? Je veux facilement supporter plus de 100 photos ou plus.

Photos doivent être en couches, si bien que je peux changer l'ordre d'empilement. Est-ce que j'utilise CoreAnimation pour cela?

Je ne ai pas besoin du code source fini juste quelques pointeurs et des idées générales. Je vais (essayer de) comprendre la mise en œuvre moi-même.

FWIW, je cible 10.5+, j'utilise Obj-C 2.0 et la collecte des déchets.

Merci d'avance!

Répondre

2

Vous devriez certainement utiliser CALayer objets. L'utilisation d'un ensemble de sous-vues NSImageView devient très rapidement impossible à gérer, en particulier si vous avez plus de 100 images à l'écran. Si vous ne voulez pas utiliser Core Animation pour une raison quelconque, vous feriez bien mieux de créer une seule vue personnalisée et de gérer vous-même le dessin de l'image et le test de hit. Cela sera plus efficace que l'instanciation de nombreux objets NSImageView. Cependant, les couches Core Animation permettent d'améliorer considérablement les performances de cette approche, car chaque couche est mise en mémoire tampon dans le GPU, ce qui vous permet de faire glisser les calques avec un coût pratiquement nul et de dessiner chaque image une seule fois. plutôt qu'à chaque fois que quelque chose change dans la vue. Core Animation gère également l'empilement de couches pour vous. Jetez un oeil à l'exemple de code CocoaSlides qui illustre une application très similaire à ce que vous décrivez, y compris les tests de coup et l'animation simple.

2

La méthode la plus simple consiste à utiliser NSImageViews. Vous pouvez créer une sous-classe qui peut être facilement déplacée à l'échelle et pivotée. Une option plus complexe mais visuellement supérieure consisterait à utiliser des couches d'animation de base (CALayer).

Tant que vous maintenez les représentations de photos comme des objets distincts (de sorte que vous pouvez manipuler individuellement) ils utiliseront toute une partie de la mémoire, peu importe la façon dont vous les représentez. Si vous fournissez toutes les données disponibles sur les photos, chacune pourrait prendre plusieurs megs. Vous voudrez probablement réduire la qualité d'affichage de l'image, c'est-à-dire la taille en pixels, la fidélité, etc., sauf lorsque la photo particulière est en cours de traitement en détail.

Rappelez-vous, vous ne devez pas traiter les photos comme les objets physiques qu'ils imitent. Vous devez simplement créer l'illusion d'objets physiques dans l'interface. Nous sommes des scénographes de théâtre, pas des architectes. Tant que votre modèle de modèle de données reste rigoureux pour la tâche à accomplir, l'interface peut s'engager dans toutes sortes d'illusions pour le bénéfice de l'utilisateur.

+0

Donc, en utilisant NSImageViews chaque photo serait sa propre vue. J'ai lu quelque part que la création de nombreuses vues serait coûteuse (sur RAM et processeur), est-ce vrai? Je suppose que je devrais sous-échantillonner les photos afin qu'elles utilisent une quantité raisonnable de mémoire, n'est-ce pas? Enfin, les CALayers peuvent-ils répondre aux événements de la souris? Ou pourrais-je mettre chaque NSImageView sur son propre CALayer? Merci pour votre aide !! – Ron

+0

Vous pouvez utiliser CALayers comme une vue.Ils existent dans une hiérarchie et ils répondent aux hits (bien que le travail de grognement pour les gérer comme une vue soit plus étendu par rapport à une vue.) CALayers ne vous épargnera pas beaucoup de mémoire si vous les utilisez pour afficher les images complètes. . Lorsque vous avez un fichier 2meg, la proportion de la surcharge mémoire entre une vue et une couche est triviale. CALayers prennent moins de temps de processeur. – TechZen

+0

En outre, comme je l'ai dit, vous avez seulement besoin de créer l'illusion des photos fullblown et seulement dans les photos qui sont les plus actifs et les plus en avant. Ceux en arrière-plan peuvent être réduits en taille et en résolution. Vous devriez probablement réfléchir aux données exactes à afficher, puis tester la solution qui fonctionne le mieux. J'imagine que vous avez reçu une amende pour que CALayers fonctionne le mieux en arrière-plan et que les vues fonctionnent mieux au premier plan. Mélanger et assortir. – TechZen

Questions connexes