iOS SDK Erstellen eines fantastischen Karussells

Binden Sie Ihre Benutzer mit atemberaubenden Karussells an. Wir werden sehen, wie einfach und sauber scrollbare interaktive Karussells in Ihren iOS-Anwendungen implementiert werden können. Dank der hohen Konfigurierbarkeit können Sie 3D-, Flat-, Rotations- und Endlos-Scroll-Arrays für Daten, Bilder oder Schaltflächen verwenden.

Nachfolgende Änderungen an Techniken und Software

Bestimmte Aspekte von Anwendungen oder Techniken, die in diesem Lernprogramm verwendet werden, haben sich seit der ursprünglichen Veröffentlichung geändert. Dies kann es ein wenig schwierig machen, mitzuverfolgen. Wir empfehlen Ihnen, sich diese neueren Tutorials zum gleichen Thema anzusehen:

Erstellen Sie ein fantastisches Karussell, Version 2.0

Am 9. Januar 2007 stellte Steve Jobs das iPhone vor einem begeisterten Publikum vor. In seinem Vortrag demonstrierte er viele der Eigenschaften, die eine völlig neue Art der Interaktion mit Technologie und Informationen schaffen würden. Eine dieser vielen Funktionen wurde durch eine einfache und leistungsstarke Nachricht dargestellt - "berühren Sie Ihre Musik". Als er dort oben stand und Bob Dylan über den Lautsprechern spielte, sind Steve Jobs "durchgedreht" mühelos Musikalben, und diese Botschaft war klar.

Nun, fast fünf Jahre später, ist dieselbe Botschaft wahr. Die Art und Weise, wie wir heute unsere Musik durchsuchen können, strahlt Magie aus. Als Entwickler können wir unseren Benutzern dieselbe Erfahrung für alle Arten von Daten bieten, nicht nur für Songs und Alben.

Für diejenigen, die bereits mit der Entwicklung für iOS vertraut sind, kann es einschüchternd sein, die Anzahl der Faktoren zu berücksichtigen, die für die Implementierung von scheinbar einfachem wie Cover Flow erforderlich sind: Animationen und reibungsloses Scrollen, Optimierung der Bildverarbeitung, Abfangen von Berührungsinteraktionen usw.

Glücklicherweise hat Nick Lockwood von Charcoal Design eine Klasse mit dem Namen "iCarousel" geschaffen, mit der alle schweren Aufgaben für uns erledigt werden, und er hat es als Open Source-Projekt veröffentlicht. Das bedeutet, dass wir schnell und effizient zum Rest kommen können unserer Entwicklung, während Sie dennoch den hochgradig interaktiven, berührungsfreundlichen Cover Flow genießen.

Eine der wichtigsten Funktionen von iCarousel ist die Auswahl von gebrauchsfertigen Anzeigetypen:

  • iCarouselTypeLinear
  • iCarouselTypeRotary
  • iCarouselTypeInvertedRotary
  • iCarouselTypeCylinder
  • iCarouselTypeInvertedCylinder
  • iCarouselTypeCoverFlow
  • iCarouselTypeCoverflow2

Es ist auch möglich, diese Stile an Ihre Bedürfnisse anzupassen. Dies kann jedoch auch ein separates Tutorial oder ein Quick Tip sein (lassen Sie uns dies in den Kommentaren wissen, wenn Sie interessiert sind)..


Schritt 1: iCarousel beziehen und einrichten

iCarousel wird auf github gehostet, was bedeutet, dass Sie es entweder als Git-Klon oder als ZIP-Download erhalten können. Sie finden es unter https://github.com/nicklockwood/iCarousel. Machen Sie also weiter und holen Sie sich nach Ihrer bevorzugten Methode eine lokale Kopie von iCarousel.

In diesem Projekt werden auch einige Bilder verwendet. Wenn Sie dies nicht bereits getan haben, sollten Sie die "Quelldateien" oben auf dieser Seite herunterladen. In dieser ZIP-Datei gibt es ein Verzeichnis mit dem Namen "Tiere". , die sieben verschiedene Tierbilder hat. (Diese Bilder stammen von Joy Tek auf Flickr (http://www.flickr.com/photos/joytek/collections/72157627168953450/) und wurden für dieses Lernprogramm verkleinert.)

Nachdem nun alle erforderlichen Dateien heruntergeladen wurden, können wir ein fantastisches Karussell erstellen!

Wir beginnen mit dem Hinzufügen der iCarousel-Klassendateien, dann der Bilddateien und schließlich stellen wir sicher, dass die App auf den Querformatmodus ohne sichtbare Statusleiste beschränkt wird. (iCarousel wird im Portrait-Modus arbeiten, aber wir werden es jetzt einfach halten, indem wir vorerst nur mit Landscape arbeiten.) Bevor wir das alles machen, wollen wir ein neues Projekt beginnen.

Wir brauchen nur ein einziges Fenster für dieses Projekt, daher wird eine "Single View Application" in Ordnung sein. Ich nenne mein Projekt "Karussell" und verwende die automatische Referenzzählung. Daher ist es wichtig, diese Option nicht zu vergessen.

Nachdem unser Projekt erstellt wurde, können Sie die iCarousel-Klassendateien hinzufügen, indem Sie das Verzeichnis "iCarousel" ziehen und in das Projekt ziehen. (Im iCarousel-Verzeichnis befinden sich nur zwei Dateien: "iCarousel.h" und "iCarousel.m") ”.) Hinweis: Wenn Sie das gesamte Verzeichnis in Ihr Projekt ziehen, stellen Sie sicher, dass Sie" Gruppen für alle hinzugefügten Ordner erstellen "..

iCarousel hängt vom Rahmen "QuartzCore" ab und unterstützt derzeit ARC nicht. Daher müssen wir einige einfache Aufgaben ausführen, um sicherzustellen, dass unsere neu hinzugefügte Klasse mit unserem Projekt zusammenarbeitet.

Um das QuartzCore-Framework hinzuzufügen, klicken Sie im linken Navigator auf die Projektdatei (dies ist Ihr Projektname; mein Name lautet "iCarousel 1-Ziel, iPhone-Betriebssystem ..."). Oben auf dem Bildschirm haben Sie jetzt ein Ziel Build-Einstellungen. Klicken Sie auf "Build-Phasen", und erweitern Sie dann "Link-Binär mit Bibliotheken" und klicken Sie auf die Schaltfläche "+" in der linken unteren Ecke. Ein Fenster wird geöffnet und Sie können unser Framework finden, indem Sie "QuartzCore" in das Suchfeld eingeben. Klicken Sie auf "Hinzufügen", und Sie sind fertig.

Dann setzen wir ein Compile-Flag, das eine Ausnahme für den LLVM-Compiler für iCarousel macht. Gehen Sie auf derselben Seite zum Abschnitt "Compile Sources" und wir gehen zum Eintrag "iCarousel". Doppelklicken Sie auf diese Zeile und geben Sie "-fno-objc-arc" (ohne Anführungszeichen) in das Popover-Fenster ein.

Wir werden die Statusleiste für diese App deaktivieren, gehen Sie also zu "Info" für unser Ziel und unter "Benutzerdefinierte iOS-Zieleigenschaften". Fügen Sie eine neue Zeile hinzu (Rechtsklick ->; Hinzufügen.) Zeile) und setzen Sie den Text im Feld "Schlüssel" auf "Statusleiste ist anfangs ausgeblendet". Setzen Sie dann den "Wert" auf "JA"..

Bevor wir uns nun mit der eigentlichen Implementierung befassen, möchten wir die Ausrichtung unserer App auf Querformat festlegen und sicherstellen, dass sie (zumindest jetzt) ​​nicht in den Hochformatmodus wechselt. Wir gehen einfach zur Registerkarte "Zusammenfassung" für unser Ziel und stellen sicher, dass die Optionen "Landscape Left" und "Landscape Right" die einzigen sind, die im Abschnitt "Unterstützte Geräteausrichtungen" ausgewählt werden.

Dann können wir in unsere Hauptansicht-Controller-Implementierungsdatei ("MTViewController.m" für mich) gehen und die Methode ändern:

 - (BOOL) sollteAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation // Rückgabe von JA für unterstützte Ausrichtungen return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 

Das letzte, was wir jetzt tun müssen, ist, unsere Bilder von den Zootieren in unser Projekt aufzunehmen. Ich habe sieben solcher Bilder in die Quelldateien eingefügt, die Sie verwenden können. Laden Sie sie einfach von dort ab, wo Sie das Quelldateiverzeichnis entpackt haben, und ziehen Sie sie in unser Projekt. (Sie können auch einfach das gesamte "Animals" -Verzeichnis ziehen, in dem alle Bilder enthalten sind.) Jetzt können Sie rollen!


Schritt 2: Einrichten unserer Daten und unseres Karussells

In unserem Karussell werden einige Bilder verschiedener Zootiere angezeigt, und unter dem aktuellen Bild zeigen wir den Namen des Tieres und welche Art von Futter sie gerne essen. In einer Produktionsumgebung sollten Sie über echte Daten verfügen, mit denen Sie arbeiten können. In unserem Beispiel werden jedoch nur wenige NSArrays mit Dummy-Daten eingerichtet.

Unser erstes Array wird eine Liste der Bildnamen sein, damit wir sie finden und in unser Karussell laden können. Wir nennen diese Liste "Bilder"..

Das zweite Array enthält eine Liste von Namen, die unseren Bildern entsprechen, sowie einen kleinen Satz, der diesem Format folgt: [Tiername] Eat: [Nahrung]. Bei Bären sagen wir zum Beispiel: "Bears Eat: Honey". Dieses Array nennen wir "Beschreibungen"..

Wir werden diese NSArrays in unserer Hauptansicht-Controller-Header-Datei ("MTViewController.h" für mich) einrichten..

 @ Eigenschaft (stark, nichtatomar) NSMutableArray * Tiere; @ property (strong, nonatomic) NSMutableArray * -Beschreibungen;

Und natürlich synthetisieren Sie sie in unserer Implementierungsdatei:

 Tiere synthetisieren, Beschreibungen;

Da wir in diesem Beispiel eine .xib verwenden, möchten wir unser Setup in der "initWithNibName" -Methode vornehmen. Lassen Sie uns jetzt die Bildnamen und die Lebensmittelbeschreibungen in ihre Arrays einfügen.

 - (id) initWithNibName: (NSString *) nibNameOrNil-Bundle: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil-Bundle: nibBundleOrNil]; if (self) // Karussell-Datenumbruch einrichten = NEIN; self.animals = [NSMutableArray arrayWithObjects: @ "Bear.png", @ "Zebra.png", @ "Tiger.png", @ "Goat.png", @ "Birds.png", @ "Giraffe.png", @ "Chimp.png", nil]; self.descriptions = [NSMutableArray arrayWithObjects: @ "Bären essen: Honig", @ "Zebras essen: Gras", @ "Tiger essen: Fleisch", @ "Ziegen fressen: Unkraut", @ "Vögel essen: Samen", @ " Giraffen essen: Bäume ", @" Schimpansen essen: Bananen ", nil];  return self; 

Sie werden feststellen, dass es auch eine Eigenschaft "wrap" gibt, die wir auf "NO" gesetzt haben. Dies ist eine iCarousel-Eigenschaft, die dafür sorgt, dass unser Karussell nicht in einer Endlosschleife durch unsere Bilder blättert. Stattdessen wird das Scrollen nach dem ersten und letzten Element mit einer schönen Gummiband-Animation beendet. Wir werden das später genauer untersuchen.

Da wir jetzt einige Daten in unserer App haben, müssen wir die eigentliche iCarousel-Klasse implementieren. iCarousel arbeitet wie UITables mit den Protokollen "Datenquelle" und "Delegieren". Wir implementieren diese, indem wir zunächst die iCarousel-Klasse in unseren Header importieren.

 #import "iCarousel.h"

Als Nächstes fügen wir nach dem Teil "UIViewController" der Header-Interface-Deklaration den folgenden Code hinzu:

 ;

Während wir hier sind, können wir auch unsere "wrap" -Eigenschaft hinzufügen, die wir in unserer "initWithNibName" -Methode festlegen.

 @ Eigenschaft (nichtatomisch) BOOL-Hülle;

Jetzt, da unser Header fertig ist, müssen wir UIView und UILabel anschließen, damit wir unser Karussell und den Beschreibungstext anzeigen können. Wir öffnen also unsere .xib-Datei (für mich "MTViewController.xib") und fügen unsere neuen Elemente hinzu.

Für iCarousel benötigen wir eine UIView. Ich setze den Hintergrund von mir auf "Lead", damit es hinter den Bildern schön dunkel ist.

Damit iCarousel diese UIView als Unterkategorie "iCarousel" erkennt, gehen wir zum Identitätsinspektor und ändern die "Klasse" in "iCarousel" im Abschnitt "Benutzerdefinierte Klasse". Klicken Sie dann mit der rechten Maustaste In unserem neuen UIView können wir unsere Optionen "dataSource" und "delegieren" auf den "Eigentümer der Datei" ziehen. Wir müssen auch das "Referenzierungs-Outlet" für unsere Karussellansicht auf die Eigenschaft "Karussell" in unserem "Dateieigentümer" setzen. Wir sind fast mit unserer iCarousel-Ansicht fertig, aber zuerst arbeiten wir an unserem Label und dann Wir werden beide neuen Ansichten mit unserer Klasse "MTViewController" verbinden.

Also, ich werde den Hintergrund für die Hauptansicht auf "Wolfram" setzen, was eine hellere graue Fläche für den Hintergrund des Etiketts bereitstellt, die den Beschreibungstext des ausgewählten Tieres anzeigt. Und dann natürlich ich ziehe über ein UILabel und zentriere es unter meinem iCarousel UIView.

Wenn alles vorhanden ist, kann ich jetzt meinen "Assistenten-Editor" öffnen und meine neuen Ansichten einfach mit der rechten Maustaste anklicken und ziehen. Zuerst die iCarousel-Ansicht direkt unterhalb des Arrays "Beschreibungen" in meiner Header-Datei für die Hauptansicht, und dann mache ich es das gleiche mit meinem UILabel. Ich habe meine Karussellansicht "Karussell" und mein UILabel "Etikett" genannt..

Dies beendet unsere Arbeit mit der Header-Datei sowie der .xib-Datei. Zusammenfassend haben wir die Klasse iCarousel importiert, die Protokolle dataSource und Delegate von iCarousel hinzugefügt und unsere Eigenschaften für das Karussell, das Label und die Arrays erstellt.


Schritt 3: Damit alles funktioniert

Das iCarousel-Protokoll unterstützt eine Reihe von Methoden, die alle visuellen und interaktiven Elemente des Karussells betreffen. Eine vollständige Referenz der verfügbaren Methoden, Eigenschaften usw. finden Sie auf der iCarousel-Seite für Github hier: https://github.com/nicklockwood/iCarousel. Im Moment müssen wir jedoch nur unsere Arrays als Daten für unser Karussell einrichten und das Verhalten für das Karussell so konfigurieren, wie wir es wollen.

Für dieses Beispiel sind dies die iCarousel-Methoden, die wir verwenden werden:

 - (NSUInteger) numberOfItemsInCarousel: (iCarousel *) Karussell return [Anzahl der Tiere]; 

Wir setzen die Gesamtzahl der Elemente auf die Anzahl der Elemente in unserem "Tiere" -Array.

 - (NSUInteger) numberOfVisibleItemsInCarousel: (iCarousel *) carousel // Beschränke die Anzahl der Elementansichten, die (aus Leistungsgründen) gleichzeitig geladen werden. Return 7; 

Für das iPhone möchten wir nur bis zu 7 Elemente gleichzeitig anzeigen. Dies ist keine absolute Zahl, aber für die Leistung gut.

 - (UIView *) carousel: (iCarousel *) carousel viewForItemAtIndex: (NSUInteger) index // Eine nummerierte Ansicht erstellen UIView * view = [[UIImageView Allocation] initWithImage: [UIImage imageNamed: [animals objectAtIndex: index]]; Ansicht zurückkehren; 

Dies ähnelt der Arbeit mit der aktuellen Zelle in einer UITableView. Hier legen wir den Inhalt jedes Karussellelements als UIView mit einem UIImage fest. Der UIImage lädt das .png für das entsprechende Tier in das Feld "Tiere".

 - (NSUInteger) numberOfPlaceholdersInCarousel: (iCarousel *) carousel // Anmerkung: Platzhalteransichten werden auf einigen Karussells nur angezeigt, wenn das Wrapping deaktiviert ist. Return 0; 

Platzhalter sind Buchstabenteile am Anfang und Ende unserer Bildgruppe. Wir wollen diese nicht, also kehren wir 0 zurück. Aus Neugierde können Sie das ändern, um 1 zurückzugeben, aber für unser Beispiel möchten wir es so belassen, wie es ist.

 - (CGFloat) carouselItemWidth: (iCarousel *) Karussell // Normalerweise sollte dieses etwas breiter sein als die Elementansichten 240; 

Ziemlich selbsterklärend, das ist, wie viel Platz das Karussell jedem Artikel geben wird. Unsere Bilder sind 220px breit, daher habe ich hier 240 eingestellt, um etwas Abstand zu haben.

 - (BOOL) KarussellShouldWrap: (iCarousel *) Karussell // Wickel alle Karussells zurück wickeln; 

Dies ist in unserer "initiWithNibName" -Methode auf "no" gesetzt und verhindert, dass unsere Elemente unendlich oft scrollen.

 - (void) carouselDidEndScrollingAnimation: (iCarousel *) aCarousel [label setText: [NSString stringWithFormat: @ "% @", [Beschreibungen objectAtIndex: aCarousel.currentousemindex]]; 

Und schließlich ist dies die Methode, die ausgeführt wird, wenn wir einen bestimmten Artikel anhalten. Wir setzen den Text unserer UILable auf den Inhalt unseres Arrays "Beschreibungen" im entsprechenden Index für unseren aktuellen Artikel. Das ist es auch für die iCarousel-Methoden.

Das Letzte, was wir jetzt vor dem Ausführen unserer App tun möchten, ist die Art des Karussell-Ansichtsstils, den wir wünschen. Wir können dies in der "(void) viewDidLoad" -Methode tun, indem Sie den Typ carousel.type auf den gewünschten Stil setzen.

 - (void) viewDidLoad carousel.type = iCarouselTypeCoverFlow2; [super viewDidLoad]; 

Eine vollständige Liste der Stile finden Sie am Anfang dieses Artikels oder auf der iCarousel-Github-Seite.

Nun können Sie Ihre App erstellen und ausführen, und Sie sollten eine scrollbare Liste von Tierbildern mit Beschreibungen darunter sehen. Ich empfehle Ihnen dringend, mit den verschiedenen Stilen und Eigenschaften des Karussells zu experimentieren, und vielleicht können wir uns in der Zukunft sogar mit der Interaktivität mit Karussellprodukten befassen.