Besoin de faire un diagramme de Gantt, comme le contrôle d'iOS, à dessiner ou à la sous-vue?

StackOverflow https://stackoverflow.com//questions/22001895

Question

Je suis prêt à commencer à créer un diagramme de Gantt, comme le contrôle dans iOS pour mon application.J'ai besoin de montrer une chronologie des événements.Fondamentalement un tas de rectangles, des lignes/arcs pour la décoration, peut-être un point de contact, ou de deux ou modifier les attributs.Il sera essentiellement un "plein écran" contrôle sur mon téléphone.

Je vois deux chemins pour mettre en œuvre cette coutume UIView sous-classe:

  1. Simplement mettre en œuvre drawRect: et aller à la ville à l'aide de CoreGraphics les appels.Probablement divisés sur un tas de méthodes privées qui font tout le travail de dessin.Éventuellement mettre en cache certaines informations que nécessaire, afin d'aider avec n'importe quel sous-région de détection de collision.

  2. Plutôt que de "tracer" le graphisme, ajoutez un bouquet de UIViews que les enfants à l'aide de addSubview: et la manipulation de leurs layer propriétés de les amener à montrer les différents objets graphiques, et bounds\frame pour obtenir la bonne position.Et puis il suffit de laisser le "dessin" de prendre soin de soi.

Est un chemin mieux que les autres?J'ai peut-end d'essayer les deux dans le long terme, juste pour voir, mais j'ai pensé chercher la sagesse de ceux qui sont partis avant première.

Mon deviner c'est que l' plus rapide la solution serait d'aller le drawRect: route, et la sous-vue approche aurait besoin de plus de code, mais peut-être plus robuste (plus facile la détection de collision, le support de l'animation, découpage automatique de gestion, etc).Je ne veux être en mesure de mettre en œuvre pincer pour zoomer et comme à long terme.

Mise à JOUR

Je suis allé avec l' UICollectionView approche.Ce qui m'a fait de la sélection et de défilement pour gratuit (après quelques surprises).J'ai été très heureux avec les résultats.

Était-ce utile?

La solution

Va avec CoreGraphics va vous forcer à écrire de nombreuses lignes de code que construire avec UIViews, bien qu'il soit plus performant et mieux dans la mémoire.Cependant, vous êtes susceptible d'avoir besoin d'une solution plus robuste pour la gestion de l'ensemble de ce contenu.Un UICollectionView cela semble une bonne solution pour la cartographie de vos données à un point de vue avec un custom UICollectionViewCell sous-classe.Cela va être beaucoup plus rapide à développer de roulement de votre propre, et est livré avec une grande flexibilité grâce à la UICollectionViewLayout les sous-classes.Pincer pour zoomer n'est pas pris en charge hors de la boîte, mais il y a façons de le faire.C'est également mieux pour mémoire qu'à l'aide d'un tas de UIViews en raison de la cellule de réutilisation, mais le rechargement peut devenir lent avec quelques centaines d'articles qui ont tous des tailles différentes pour être calculé.

Autres conseils

Quand il s'agit de performance, bien écrit drawRect: est préféré, surtout quand vous pourriez potentiellement avoir à rendre de nombreux de nombreux rectangles.Avec vue, tout un système de mise en page se met à l'ouvrage, bien pire, si vous avez de la mise en page automatique, où l'ensemble d'un système de disposition va à la ville et tue votre performance.J'ai récemment mis à jour notre calendrier des vues à partir de la vue sur la CG pour des raisons de performances.

Dans tous les autres aspects, le travail avec des points de vue est préférable, bien sûr.Interface Builder, facile geste de reconnaissance de l'installation, OO, etc.Vous pouvez toujours créer de la logique des classes pour chaque élément et de l'avoir de dessiner lui-même dans le contexte actuel (la meilleure pour passer d'un contexte de référence et appuyer sur), mais toujours pas aussi simple.

Sur les appareils récents, vue de l'exécution du dessin est assez élevé en fait.Mais si vous souhaitez que ces iPhone 4 et 4S appareils, si vous souhaitez que ces iPad 3 appareils, ce qui manque beaucoup dans les performances du processeur graphique, je dirais, en fonction de vos graphiques de potentiel tailles, vous pourriez avoir à aller la CG façon.

Maintenant, vous mentionnez le pincer pour zoomer.C'est une chienne n'importe quoi.Si vous écrivez le votre drawRect: eh bien, vous pourriez éventuellement travailler votre chemin à carrelage et de travailler avec cela.

Si vous prévoyez de laisser à l'utilisateur de déplacer les pièces du graphique autour de moi, je serais certainement vous suggérons d'aller avec les points de vue.

Pour info, vous serez en mesure de gérer pincer pour zoomer avec drawRect l'amende juste.

Ce serait me pousser à l'aide de UIView est dans ce cas serait de soutenir en faisant glisser les pièces du graphique, l'animation des transitions dans le tableau et de s'appuyer sur les éléments du graphique (bien que ce ne soit pas trop dur avec drawRect:).Aussi, si vous avez des éléments dans votre graphique qui devront lourds, l'utilisation du PROCESSEUR de rendu, vous obtiendrez de meilleures performances si vous avez besoin de redessiner sous-parties de votre graphique avec UIView depuis, le rendu des éléments est mis en cache pour une couche et vous aurez seulement besoin de redessiner les pièces que vous aimez et pas l'ensemble du graphique.

Si vous créez un graphique sera TRÈS grosse ET vous souhaitez utiliser drawRect:vous aurez probablement envie de regarder à l'aide de CATileLayer pour vous soutenir afin que vous n'avez pas l'ensemble de la couche dans la mémoire.Cela peut ajouter des défis de plus si vous voulez rendre la demande de tuiles et non pas l'ensemble de la zone.

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