Müssen Sie ein Gantt-Diagramm wie ein Steuerelement in iOS erstellen, zeichnen oder Unteransicht?

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

Frage

Ich bin kurz davor, ein Gantt-Diagramm wie ein Steuerelement in iOS für meine App zu erstellen.Ich muss eine Zeitleiste der Ereignisse anzeigen.Grundsätzlich eine Reihe von Rechtecken, einige Linien / Bögen zur Dekoration, möglicherweise ein oder zwei Berührungspunkte zum Bearbeiten von Attributen.Es wird im Grunde eine "Vollbild" -Steuerung auf meinem Handy sein.

Ich sehe zwei grundlegende Pfade zum Implementieren dieser benutzerdefinierten UIView-Unterklasse:

  1. Einfach umsetzen drawRect: und geh in die Stadt mit CoreGraphics nennen.Höchstwahrscheinlich aufgeteilt auf eine Reihe privater Methoden, die die gesamte Zeichenarbeit erledigen.Möglicherweise werden nach Bedarf einige Informationen zwischengespeichert, um bei der Erkennung von Treffern in Unterregionen zu helfen.

  2. Anstatt die Grafiken zu "zeichnen", fügen Sie eine Reihe von UIViews als untergeordnete Elemente hinzu, indem Sie Folgendes verwenden addSubview: und manipulieren ihre layer eigenschaften, um sie dazu zu bringen, die verschiedenen Grafikstücke anzuzeigen, und bounds\frame um sie angemessen zu positionieren.Und dann lass "Zeichnen" einfach für sich selbst sorgen.

Ist ein Weg besser als der andere?Ich werde vielleicht auf lange Sicht beides versuchen, nur um zu sehen, aber ich dachte, ich würde zuerst die Weisheit derer suchen, die vorher gegangen sind.

Mein erraten ist das der schneller die Lösung wäre, die zu gehen drawRect: route und der Unteransichts-Ansatz würden mehr Code erfordern, aber möglicherweise robuster sein (einfachere Treffererkennung, Animationsunterstützung, automatisches Clipping-Management usw.).Ich möchte umsetzen können zum Zoomen drücken und dergleichen, langfristig.

UPDATE

Ich ging mit dem UICollectionView Ansatz.Was mir die Auswahl und das kostenlose Scrollen brachte (nach einigen Überraschungen).Ich bin mit den bisherigen Ergebnissen ziemlich zufrieden.

War es hilfreich?

Lösung

Die Verwendung von CoreGraphics zwingt Sie dazu, viel mehr Codezeilen zu schreiben als das Erstellen mit UIViews, obwohl dies leistungsfähiger und speicherintensiver ist.Sie werden jedoch wahrscheinlich eine robustere Lösung für die Verwaltung all dieser Inhalte benötigen.A UICollectionView scheint eine geeignete Lösung zu sein, um Ihre Daten einer Ansicht mit einer benutzerdefinierten zuzuordnen UICollectionViewCell Subklasse.Dies wird viel schneller zu entwickeln sein als das Rollen Ihrer eigenen und kommt mit großer Flexibilität durch UICollectionViewLayout Subklassen.Pinch to Zoom wird standardmäßig nicht unterstützt, aber es gibt möglichkeiten, es zu tun.Dies ist auch besser für den Speicher als die Verwendung einer Reihe von UIViews aufgrund der Wiederverwendung von Zellen, aber das Nachladen kann mit einigen hundert Elementen, die alle unterschiedliche Größen haben, langsam werden.

Andere Tipps

Wenn es um Leistung geht, ein gut geschriebenes drawRect: wird bevorzugt, insbesondere wenn Sie möglicherweise viele, viele Rechtecke rendern müssten.Mit Ansichten funktioniert ein gesamtes Layoutsystem, viel schlimmer, wenn Sie ein automatisches Layout haben, bei dem ein gesamtes Layoutsystem in die Stadt geht und Ihre Leistung beeinträchtigt.Ich habe kürzlich unsere Kalenderansichten aus Leistungsgründen von ansichtsbasiert auf CG-basiert aktualisiert.

In allen anderen Aspekten ist das Arbeiten mit Ansichten natürlich sehr bevorzugt.Interface Builder, einfache Einrichtung der Gestenerkennung, OO usw.Sie könnten immer noch logische Klassen für jedes Element erstellen und es sich selbst im aktuellen Kontext zeichnen lassen (am besten, um eine Kontextreferenz zu übergeben und darauf zu zeichnen), aber immer noch nicht so einfach.

Auf neueren Geräten ist die Leistung beim Zeichnen von Ansichten tatsächlich recht hoch.Aber wenn Sie diese iPhone 4- und 4S-Geräte wollen, wenn Sie diese iPad 3-Geräte wollen, denen es an GPU-Leistung mangelt, würde ich sagen, abhängig von den potenziellen Größen Ihrer Grafiken, müssen Sie möglicherweise den CG-Weg gehen.

Jetzt erwähnen Sie Pinch to Zoom.Das ist eine Schlampe, egal was passiert.Wenn du deine schreibst drawRect: nun, Sie könnten sich irgendwann zum Kacheln vorarbeiten und damit arbeiten.

Wenn Sie vorhaben, den Benutzer Teile des Diagramms verschieben zu lassen, würde ich definitiv vorschlagen, mit den Ansichten zu gehen.

Zu Ihrer Information, Sie werden in der Lage sein, mit Pinch to Zoom mit drawRect ganz gut umzugehen.

Was mich in diesem Fall dazu bringen würde, UIViews zu verwenden, wäre, das Ziehen von Teilen des Diagramms, das Animieren von Übergängen im Diagramm und das Tippen auf Elemente im Diagramm zu unterstützen (obwohl das mit drawRect nicht allzu schwer wäre :).Wenn Ihr Diagramm Elemente enthält, die zum Rendern eine hohe CPU-Auslastung erfordern, erzielen Sie außerdem eine bessere Leistung, wenn Sie Teilbereiche Ihres Diagramms mit UIView neu zeichnen müssen, da das Rendern der Elemente in einer Ebene zwischengespeichert wird und Sie nur neu zeichnen müssen die Stücke, die dir wichtig sind und nicht das gesamte Diagramm.

Wenn Ihr Diagramm SEHR groß ist UND Sie drawRect verwenden möchten:Sie werden wahrscheinlich die Verwendung von CATileLayer für Ihre Sicherung in Betracht ziehen wollen, damit Sie nicht die gesamte Ebene im Speicher haben.Dies kann zusätzliche Herausforderungen mit sich bringen, wenn Sie nur die angeforderten Kacheln und nicht den gesamten Bereich rendern möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top