Grundlegende Technik-Frage zu Animationen / Grafikdarstellungen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Grundlegende Technik-Frage zu Animationen / Grafikdarstellungen

    Schönen guten Morgen zusammen,

    mein erster Beitrag hier im Forum und direkt auch eine Frage. Ich bin kein Newbie, was Programmierung angeht, ich beschäftige mich seit ca. anderthalb Jahren mit Android-Apps und habe vor kurzem auch meine erste iOS-App fertiggestellt (u.a. mit CoreData, PDF-Erstellung, usw.).

    Nun plane ich, eine App im Stil einer Mindmap zu entwickeln. Es wird keine Mindmap selbst, aber ähnelt dem Konzept von der Technik her.
    Es gibt also einen Hauptpunkt, von dem weitere Unterpunkte / Nodes ausgehen, die man auf- und zuklappen kann (soll animiert werden). Ich brauche also einen "Hintergrund", der mir beliebig viele Nodes darstellen kann und durch den der Benutzer durch eine Geste (z.B. Wischen) navigieren / scrollen kann.

    Bevor ich mich nun in diverse neue Themen einlese, bräuchte ich ein paar Tipps, wie (mit welcher Technik) ich das Vorhaben realisieren kann.
    Gibt es dafür eine View? Eine Grafikengine? Oder realisiert man sowas mit Quartz 2D :?:
    Bin über jeden Hinweis dankbar ;)
  • Ich würde einen Scrollview mit einem View als „Zeichenfläche“ verwenden, in dem Du die Nodes als Views platzierst. Der Scrollview bietet Dir neben dem Scrollen auf von Haus aus schon Zoomen an. Die Animationen bekommst Du entweder über Transitionen (developer.apple.com/library/io…/uid/TP40006816-CH3-SW108) oder, wie Markus schon anmerkte, über Core Animation hin.
    „Meine Komplikation hatte eine Komplikation.“
  • Bei einer Mindmap würde ich vermuten, dass Du den Inhalt selber zeichnen musst. Dafür kannst Du die Methode drawRect: überschreiben, in der Du auch Bilder (z. B. für den Hintergrund) zeichnen kannst. Imageviews sind nur für die Darstellung von Bildern gedacht und lassen sich nur schlecht erweitern.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich hab noch ein paar Fragen bezüglich des ScrollViews und drawRects:

    Ich arbeite mit einem Storyboard. Es gibt einen ViewController, der ein ScrollView beinhaltet.
    Für das ScrollView nutze ich eine eigene Klasse, die auf der UIScrollView basiert und überschreibe hier die drawRect-Methode.

    Das funktioniert soweit wie es soll, allerdings:
    1) Die in der drawRect-Methode gezeichneten Formen scrollen nicht mit, wenn der Benutzer scrollt.
    2) Wie zeichne ich denn während der Laufzeit auf Grund bestimmter Ereignisse? Das muss ja alles irgendwie in die drawRect-Methode rein...


    Edit: Ich habe das Problem von Punkt 1 schon mal eingegrenzt. Wenn ich im scrollViewDidScroll

    Quellcode

    1. [scroller setNeedsDisplay]


    aufrufe, dann scrollen die gezeichneten Formen mit. Aber ist das performance-technisch vertretbar? Das scrollViewDidScroll-Ereignis wird immerhin hunderte / tausende Male aufgerufen, wenn man ein Stück scrollt. Oder gibt es doch eine andere Lösung?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fonsi ()

  • Fonsi schrieb:

    Für das ScrollView nutze ich eine eigene Klasse, die auf der UIScrollView basiert und überschreibe hier die drawRect-Methode.

    Schlechter Ansatz. Du solltest lieber einen View in den Scrollview legen, bei dem Du drawRect: überschreibst. Dieser View stellt immer den kompletten Inhalt dar und der Scrollview legt fest, welcher Ausschnitt davon zu sehen ist.
    „Meine Komplikation hatte eine Komplikation.“
  • Du hast Recht, das ist ne bessere Lösung! Danke!

    Das Ganze scrollt nun logischerweise nicht, weil man quasi die View berührt, nicht das darunterliegende ScrollView. Muss ich hier das ScrollView dann als First Responder angeben? Und wie? :huh:

    Edit: Zumindest, wenn ich die View per Storyboard einfüge. Füge ich die View per Code im viewDidLoad des ViewControllers zur ScrollView hinzu, scrollt er :wacko:


    Ich hab auch immer noch nicht so recht kapiert, wie man während der Laufzeit etwas zeichnet. Klar, im drawRect kann ich nen Kreis oder eine Linie zeichnen, aber während der Laufzeit unterschiedliche Formen zeichnen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fonsi ()

  • Du kannst einfach userInteractionEnabled des view auf NÖ setzen

    DrawRect wird doch bei jeder Bewegung des scrollviews dann aufgerundet. Dort holst du dir die Content Positionen des scrollviewcund zeichnest dementsprechend was notwendig ist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Fonsi schrieb:

    Ich hab auch immer noch nicht so recht kapiert, wie man während der Laufzeit etwas zeichnet. Klar, im drawRect kann ich nen Kreis oder eine Linie zeichnen, aber während der Laufzeit unterschiedliche Formen zeichnen?

    Möchtest Du den Inhalt animieren? Sofern es sich nicht über View-Animationen realisieren lässt, solltest Du dafür Core Animation verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • Zu meinem Verständnis reicht es erst mal, wenn es nicht animiert ist. Vielleicht hab ich mich bisher auch etwas unverständlich ausgedrückt :rolleyes:


    Angenommen ich habe 2 Buttons und möchte mit dem ersten Button einen Kreis und mit dem zweiten Button ein Quadrat zeichnen (nicht animiert, soll einfach im View erscheinen).
    Wie realisiere ich das denn?
  • macmoonshine schrieb:


    Du zeichnest niemals direkt, sondern sagst dem View immer nur über setNeedsDisplay, dass er neu gezeichnet werden soll.
    Das ist klar soweit. Aber ich kapier die Vorgehensweise immer noch nicht ?( . Um mal konkreter zu werden am Beispiel der Mindmap.

    In meiner UIView gibt es einen Hauptknoten. Der Benutzer fügt nun beliebig viele Unterknoten dazu, die per Linie mit den Hauptknoten verbunden werden.
    Wie realisiere ich nun diese Verbindungslinien?
  • Fonsi schrieb:

    macmoonshine schrieb:


    Du zeichnest niemals direkt, sondern sagst dem View immer nur über setNeedsDisplay, dass er neu gezeichnet werden soll.
    Das ist klar soweit. Aber ich kapier die Vorgehensweise immer noch nicht ?( . Um mal konkreter zu werden am Beispiel der Mindmap.

    In meiner UIView gibt es einen Hauptknoten. Der Benutzer fügt nun beliebig viele Unterknoten dazu, die per Linie mit den Hauptknoten verbunden werden.
    Wie realisiere ich nun diese Verbindungslinien?

    In Deiner drawRect: malst Du für jeden Knoten einen Kasten und für jede Verbindungslinie eine Linie (alternativ nach Belieben was anderes). Immer wenn sich ein Knoten oder eine Verbindung ändert oder was dazu kommt oder wegfällt schickst Du ein setNeedsDisplay. Fertig.

    Wenn das zu langsam ist, kannst Du auch nur ein setNeedsDisplayInRect: schicken mit dem Rechteck, das tatsächlich neu gezeichnet werden muss. Und im drawRect: vor dem Malen der einzelnen Teile prüfen, ob der Teil im dirty Rect liegt. So muss nicht immer alles neu gezeichnet werden.
    Multigrad - 360°-Produktfotografie für den Mac