2013-02-15 4 views
35

Ich versuche, die folgende Wirkung zu erzielen:UICollectionView für Spring wie Ordner

A UICollectionView zeigt ein Raster von Zellen für einen übergeordneten Objekttyp, z. G. ein Fotoalbum. Wenn ich auf eines dieser Elemente tippe, möchte ich dieses Element zum oberen Bildschirmrand scrollen und einen Springboard-ähnlichen Ordner daraus öffnen. Innerhalb dieses Ordnerbereichs sollte eine weitere Sammlung angezeigt werden, die aus den Detailelementen besteht, d. e. die einzelnen Fotos dieses Albums. Durch Antippen der verbleibenden "Eltern" -Ansicht wird der Ordner wieder geschlossen. Sehen Sie dieses Schema:

enter image description here

Was ich bisher getan haben, eine regelmäßige Sammlung Ansicht für die Alben ist. Wenn ich eines auswähle, scrollt es zum ausgewählten Element nach oben und verwendet dann JWFolders, um dort einen leeren Ordner zu öffnen. Sobald das angezeigt wird, trigger ich die umliegenden UINavigationController, um meine 2. View-Controller mit den Detailelementen zu schieben. Das ist so ausgelegt, dass es dem Benutzer erscheint, als wäre es immer noch die gleiche Ansicht.

Es gibt mehrere Probleme mit diesem Ansatz, und ich würde gerne wissen, wie diese besser zu machen:

  1. JWFolders nimmt einen Screenshot und animierte zwei Hälften davon nach oben/unten, um die Öffnung Wirkung zu erzielen. Das ist in Ordnung, aber ziemlich langsam auf einem iPad3, weil es viele Pixel bewegt und die GPU des iPad3 nicht ganz der Aufgabe gewachsen ist.

  2. Die zweite Ansicht muss pixelgenau sein, damit sie mit der ersten übereinstimmt. Dies wird wahrscheinlich versehentlich unterbrochen.

  3. Ich bin beschränkt, welche Animationen für den View Controller Übergang möglich sind. Der Standard UINavigationController 's Push von rechts ist nicht passend. Ich überschreibe das, um eine Überblendung zu machen, aber es ist noch lange nicht ideal.

Ich mag würde Zeiger bekommen, wie dieses Problem in einem vertretbaren Weise zu nähern, die viel kreative Hacking erfordert nicht gegen das, was die Rahmenbedingungen ausgelegt sind zu tun. Ich verpasse hier vielleicht etwas Offensichtliches, daher werden Hinweise auf Beispiele oder allgemeine Hinweise geschätzt.

Update:

änderte ich den Ansatz ein bisschen. Jetzt verwende ich einen Containeransicht-Controller, der über zwei eingebettete Auflistungsansicht-Controller verfügt. Einer für das "Album" und einer für den "Fotos" -Teil am unteren Rand. Mit einem UIImageView in der Mitte zwischen den beiden kann ich das Dreieck nach oben gerichtet bekommen. Dies ist auch unter Wartungsgesichtspunkten schön, weil es die Wartung erleichtert, da die beiden Sammlungen vollständig getrennt behandelt werden.

Die App verwendet automatisches Layout, so dass ich den Platzbedarf jeder der beiden eingebetteten Ansichten ändern kann, indem Sie die Einschränkungen ändern. Dies ist viel schneller als der Screenshot-basierte Ansatz mit JWFolders und funktioniert auch auf einem iPad3.

Diese fast bringt mich dahin, wo ich sein will. Das einzige, was bleibt, ist, die Eröffnungsanimation richtig zu machen. Ich möchte gleichzeitig die Alben-Sammlung scrollen, so dass das angetippte Objekt nach oben geht und die Fotosammlung mit dem Dreieck auf die Album-Zelle erweitert.

Kann ich irgendwie die untere Ansicht mit dieser Zelle über Layoutbeschränkungen verbinden, so dass der Aufruf scrollToItemAtIndexPath:atScrollPosition:animated: die untere Ansicht öffnet?

+0

Mit welchem ​​Code animieren Sie die Öffnung Ihrer imageViews-Sammlung? – AMayes

+0

Ich habe es gerade nicht zur Hand, aber es ist im Grunde eine Auto-Layout-Einschränkung für den Raum zwischen meinen Ansichten unteren Rand und die Superviews unten von seinem ursprünglichen Wert auf 0 animieren. –

+0

Wenn Sie mit Xcode Instruments vertraut sind, sollten Sie Versuchen Sie Zeit, Ihren Code zu profilieren. Es ist möglich, dass es Orte gibt, an denen Sie JWFolders animieren könnten, da die Animationen nicht so ressourcenintensiv sein sollten. –

Antwort

1

Um es zu umgehen würde ich die Bibliothek verlieren und iOS diese Anzeigeelemente ohne Screenshots oder andere Tricks bewegen. Behalten Sie auf dem Wasserhahn das angetippte Symbol bei, während Sie alle anderen abblenden. Suchen Sie den Inhalt der Sammlungsansicht vom Anfang bis zum Ende der Zeile, in der sich das angetippte Symbol befindet. Erstellen Sie zwei neue Sammlungsansichten, von denen die obere Hälfte einschließlich des angetippten Symbols und die andere Hälfte den Rest enthält. Animieren Sie diese Ansichten, um Platz für die Ordneransicht zu schaffen.

Die Ordneransicht ist eine weitere UICollectionView, die in der erstellten Lücke angezeigt wird. In der Hauptansicht werden je nach geöffneter oder geschlossener Schublade eine oder drei Ansichten angezeigt. Ich würde wahrscheinlich einen View-Controller mit einer Collection-Ansicht erstellen und die View-Controller-Containment verwenden, um alle drei Ansichten zu verwalten. Sie haben die vollständige Kontrolle darüber, wie diese Ansichten dargestellt werden, sodass Sie die obere und untere Ansicht gleichzeitig nach oben und unten animieren können, um die Ordneransicht wie Springboard anzuzeigen.

Wenn das alles funktioniert, könnten Sie verallgemeinern und anfangen, Dinge wie die Entscheidung zu treffen, das angetippte Symbol Teil der unteren Sammlung mit dem oben erscheinenden Ordner zu machen, wenn das Symbol auf dem Bildschirm niedrig war.

(Ich zögere, dies zu beantworten, wegen der großen Anzahl von upvotes noch keine Antworten, so kann ich etwas verpaßt haben - aber das ist, wie ich versuchte, würde damit beginnen, den Springboard-Effekt zu erzielen.)

+0

Danke für die (erste) Antwort :) Ich glaube nicht, dass du etwas verpasst hast. Ich habe die Frage gestellt, weil ich es vermieden hätte, mehrere Sammlungsansichten mit Animationen etc. zu jonglieren und eine "einfachere" Art bevorzugen würde, die auch an anderen Orten verwendet werden könnte. Aber ich bin zu dem Schluss gekommen, dass es wahrscheinlich der einzig gangbare Weg ist, obwohl es mehr Arbeit ist. Wir gehen derzeit mit etwas ähnlich Ihrem Vorschlag. –

0

Um dies zu lösen Problem in einer relativ einfachen Weise, könnten Sie versuchen, den Ordner eine einfache UICollectionView-Unterklasse zu machen und dann diese Zelle einfügen, wenn die Alben Zelle angetippt wird. In der Datenquelle der Sammlungsansicht müssten Sie für die Ordnerzelle eine andere Größe usw. angeben. In dem Ordner, in dem Sie die Ordnersammlungsansicht erstellen müssen, vermeiden Sie, dass die Ordnerzelle die Datenquelle der Zellenordner-Sammlungsansicht ist.