Crea un fantastico carosello, versione 2.0

Coinvolgi i tuoi utenti con fantastici caroselli! Vedremo quanto può essere semplice e pulito implementare caroselli interattivi scorrevoli nelle tue applicazioni iOS. Con un'elevata configurabilità, puoi disporre di array di scorrimento 3D, piatti, rotanti e infiniti per dati, immagini e pulsanti.

Nota del redattore: questo tutorial è stato originariamente pubblicato su Mobiletuts + a gennaio. Questa versione è stata aggiornata in modo significativo in risposta alle modifiche apportate alla libreria iCarousel.


Il 9 gennaio 2007, Steve Jobs ha presentato l'iPhone a un pubblico entusiasta. Nella sua presentazione ha dimostrato molte delle caratteristiche che andrebbero a creare un modo completamente nuovo di interagire con la tecnologia e le informazioni. Una di quelle molte funzionalità è stata presentata da un messaggio semplice e potente: "tocca la tua musica". Mentre si trovava lassù, con Bob Dylan a suonare gli altoparlanti, Steve Jobs "sfogliava" i suoi album senza sforzo. Quel messaggio era stato chiarito.

Ora, quasi cinque anni dopo, lo stesso messaggio è vero. C'è magia nel modo in cui siamo in grado di sfogliare la nostra musica oggi e, come sviluppatori, siamo in grado di portare la stessa esperienza ai nostri utenti per tutti i tipi di dati, non solo per le canzoni e gli album.

Per coloro che hanno già familiarità con lo sviluppo per iOS, potrebbe essere intimidatorio considerare il numero di fattori coinvolti per implementare qualcosa di apparentemente semplice come Cover Flow: animazione e scorrimento fluido, ottimizzazione della gestione delle immagini, intercettazione delle interazioni tattili, ecc..

Fortunatamente, Nick Lockwood di Charcoal Design ha creato una classe chiamata "iCarousel" che gestisce tutti i lavori pesanti per noi, e lo ha rilasciato come progetto open source. Ciò significa che possiamo rapidamente ed efficacemente scendere al resto del nostro sviluppo, pur godendo di Cover Flow altamente interattivo e touch-friendly.

Una delle grandi caratteristiche di iCarousel è la selezione di tipi di display pronti all'uso:

  • iCarouselTypeLinear
  • iCarouselTypeRotary
  • iCarouselTypeInvertedRotary
  • iCarouselTypeCylinder
  • iCarouselTypeInvertedCylinder
  • iCarouselTypeCoverFlow
  • iCarouselTypeCoverflow2
  • e altro ancora ...

È anche possibile personalizzare questi stili in base alle proprie esigenze, ma potrebbe essere un tutorial separato o un suggerimento rapido di per sé (fateci sapere nei commenti se siete interessati!).


Passaggio 1: ottenere iCarousel e impostazione

iCarousel è ospitato su github, il che significa che puoi ottenerlo come clone git o come download .zip. Puoi trovarlo su https://github.com/nicklockwood/iCarousel, quindi vai avanti e procurati una copia locale di iCarousel.

Questo progetto prevede anche l'uso di alcune immagini, quindi è necessario scaricare i "File sorgente" nella parte superiore di questa pagina, se non l'hai già fatto. In quel file .zip, c'è una directory chiamata "Animali" che ha sette diverse immagini di animali (queste immagini provengono da Joy Tek su Flickr - http://www.flickr.com/photos/joytek/collections/72157627168953450/) - e sono stati ridimensionati per questo tutorial).

Ora, con tutti i file necessari scaricati, siamo pronti per creare un fantastico carosello!

Inizieremo aggiungendo i file di classe iCarousel, quindi i file di immagine e, infine, ci assicureremo di limitare l'app alla modalità orizzontale senza una barra di stato visibile (iCarousel funzionerà in modalità verticale, ma lo terremo in forma semplice semplicemente lavorando con il paesaggio per ora). Ma, prima di tutto, iniziamo un nuovo progetto!

Abbiamo solo bisogno di una singola finestra per questo progetto, quindi una "Single View Application" andrà bene per ora. Chiamerò il mio progetto "Carousel" e userò Automatic Reference Counting (ARC), quindi è importante non dimenticare quell'opzione quando crei il progetto.

Una volta creato il nostro progetto, possiamo aggiungere i file di classe iCarousel afferrando la directory "iCarousel" e trascinandola nel progetto (nella directory di iCarousel ci sono solo due file: "iCarousel.h" e "iCarousel.m"). Nota: se stai trascinando l'intera directory nel tuo progetto, assicurati di "Crea gruppi per tutte le cartelle aggiunte".

iCarousel dipende dal framework "QuartzCore" e supporta pienamente ARC, quindi abbiamo alcune semplici attività da fare per assicurarci che la nostra classe appena aggiunta funzioni con il nostro progetto.

Per aggiungere il framework QuartzCore, fai clic sul file di progetto nel navigatore di sinistra (sarà il nome del tuo progetto, il mio dice "iCarousel 1target, iPhone OS ..."). Nella parte superiore dello schermo avrai ora alcune impostazioni di build di destinazione. Fai clic su "Crea fasi", quindi espandi "Collega il file binario con le librerie" e fai clic sul pulsante "+" nell'angolo in basso a sinistra. Apparirà una finestra e potrai trovare il nostro framework digitando "QuartzCore" nella casella di ricerca. Fai clic su "Aggiungi" e il gioco è fatto!

Disattiveremo la barra di stato di questa app, quindi vai alla scheda "Informazioni" del nostro target e in "Proprietà target iOS personalizzate" aggiungeremo una nuova riga (tasto destro del mouse ->; Aggiungi riga ) e impostare il testo nel campo "Chiave" su "La barra di stato è inizialmente nascosta". Quindi, imposta il "Valore" su "SÌ".

Ora, prima di entrare nell'attuale implementazione, vogliamo impostare l'orientamento della nostra App in orizzontale e accertarci che non entri in modalità verticale (almeno per ora). Andremo alla scheda "Riepilogo" del nostro obiettivo e assicuriamoci che le opzioni "Orizzontale a sinistra" e "Orizzontale a destra" siano le uniche selezionate nella sezione "Orientamenti dispositivo supportati".

Successivamente possiamo andare nel nostro file di implementazione del controller della vista principale ("MTViewController.m" per me), e cambiare il metodo:

 - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation // Restituisce YES per gli orientamenti supportati return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 

L'ultima cosa che avremo bisogno di fare per ora è ottenere le nostre immagini degli animali dello zoo nel nostro progetto. Ho incluso sette di queste immagini nei file di origine che puoi utilizzare. Prendili semplicemente da tutti i punti in cui hai decompresso la directory dei file sorgente e trascinali nel nostro progetto (potresti anche trascinare l'intera directory "Animali", che includerà tutte le immagini). E ora siamo pronti a lanciare!


Passaggio 2: impostazione dei dati e del carosello

Il nostro carosello mostrerà alcune immagini di diversi animali dello zoo e al di sotto dell'immagine attuale mostreremo il nome dell'animale e il tipo di cibo che gli piace mangiare. In un ambiente di produzione, dovresti avere alcuni dati reali su cui lavorare, ma per il nostro esempio, stiamo solo impostando alcuni NSArrays con dati fittizi.

Il nostro primo array sarà un elenco dei nomi delle immagini in modo che possiamo trovarli e caricarli nel nostro carosello. Chiameremo questa lista "immagini".

Il secondo array avrà una lista di nomi che corrispondono alle nostre immagini, così come una piccola frase che segue questo formato: [nome animale] Mangiare: [cibo]. Ad esempio, con gli orsi, diremo: "Bears Eat: Honey". Chiameremo questo array "descrizioni".

Imposteremo questi NSArrays nel nostro file di intestazione del controller di visualizzazione principale ("MTViewController.h" per me).

 @property (strong, nonatomic) NSMutableArray * animali; @property (strong, nonatomic) Descrizioni di NSMutableArray *;

E, naturalmente, sintetizzali nel nostro file di implementazione:

 @sintimi animali, descrizioni;

Effettueremo il nostro set-up nel metodo "initWithNibName", quindi inseriamo ora i nomi delle immagini e le descrizioni degli alimenti nei loro array.

 - (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; if (self) // set up carousel data wrap = NO; self.animals = [NSMutableArray arrayWithObjects: @ "Bear.png", @ "Zebra.png", @ "Tiger.png", @ "Goat.png", @ "Birds.png", @ "Giraffe.png", @ "Chimp.png", nil]; self.descriptions = [NSMutableArray arrayWithObjects: @ "Bears Eat: Honey", @ "Zebre Eat: Grass", @ "Tigers Eat: Meat", @ "Capre Eat: Weeds", @ "Birds Eat: Seeds", @ " Giraffe Eat: Trees ", @" Chimps Eat: Bananas ", nil];  return self; 

Noterai che c'è anche una proprietà "wrap", che abbiamo impostato su "NO". Questa è una proprietà di iCarousel, e farà in modo che il nostro carosello non scorra in un ciclo infinito attraverso le nostre immagini, ma, invece, smette di scorrere dopo il primo e l'ultimo elemento con una bella animazione a bande di gomma. Lo esamineremo più avanti.

Ora che abbiamo alcuni dati nella nostra app, avremo bisogno di implementare la vera classe iCarousel. iCarousel funziona come UITables, con i protocolli "data source" e "delegate". Li implementeremo importando prima la classe iCarousel nella nostra intestazione.

 #import "iCarousel.h"

Successivamente, aggiungeremo il seguente bit di codice dopo la parte "UIViewController" della dichiarazione dell'interfaccia dell'intestazione:

 ;

Mentre siamo qui, possiamo anche aggiungere la nostra proprietà "wrap", che abbiamo impostato nel nostro metodo "initWithNibName".

 @property (nonatomic) BOOL wrap;

Ora, con il nostro header pronto, dobbiamo collegare UIView e UILabel che avremo bisogno di mostrare il nostro carosello e il testo descrittivo. Quindi, apriremo il file .xib ("MTViewController.xib" per me) e aggiungeremo i nostri nuovi elementi.

Per iCarousel, avremo bisogno di un UIView. Sto impostando il mio background su "Lead", in modo che sia bello e scuro dietro le immagini.

Ora, affinché iCarousel riconosca questa UIView come sottoclasse "iCarousel", andremo a "Identificatore identità" e cambieremo la "Classe" in "iCarousel" nella sezione "Classe personalizzata". Quindi, se facciamo clic con il pulsante destro del mouse sulla nostra nuova visione utente, possiamo trascinare le opzioni "dataSource" e "delegare" sul "Proprietario file". Dovremo inoltre impostare il "Punto di riferimento" per la nostra vista del carosello sulla proprietà "aCarousel" nel nostro "Proprietario del file". Abbiamo quasi finito con la nostra vista iCarousel, ma prima lavoreremo sulla nostra etichetta e quindi collegheremo entrambe le nuove viste alla nostra classe "MTViewController".

Quindi, ho intenzione di impostare lo sfondo per la vista principale su "Tungsten", che fornirà un'area grigia più chiara per lo sfondo dell'etichetta che mostrerà il testo descrittivo dell'animale selezionato. E poi, ovviamente, trascinerò un UILabel e lo centrerò sotto il mio iCarousel UIView.

Con tutto ciò che è a posto, ora posso aprire il mio "Assistant Editor" e facilmente fare clic con il tasto destro del mouse e trascinare le mie nuove viste; prima la vista iCarousel appena sotto l'array "Descrizioni" nel mio file di intestazione della vista principale, e poi farò lo stesso con la mia UILabel. Ho chiamato il mio carousel view "carousel" e il mio UILabel "label".

E questo finisce il nostro lavoro con il file di intestazione, così come con il file .xib. In breve, abbiamo importato la classe iCarousel, aggiunto i dati iCarouselSource e delegato i protocolli e abbiamo creato le nostre proprietà per il carosello, l'etichetta e gli array.


Passaggio 3: far funzionare tutto

Il protocollo iCarousel supporta un numero di metodi che trattano tutti gli elementi visivi e interattivi del carosello. Puoi trovare un riferimento completo dei metodi, proprietà, ecc. Disponibili sulla pagina github di iCarousel qui: https://github.com/nicklockwood/iCarousel. Per ora però, abbiamo solo bisogno di impostare i nostri array come dati per il nostro carosello, così come ottenere il comportamento per il carosello configurato come lo vogliamo.

Per questo esempio, questi sono i metodi iCarousel che utilizzeremo:

 - (NSUInteger) numberOfItemsInCarousel: (iCarousel *) carousel return [numero animali]; 

Imposteremo il numero totale di elementi per il numero di elementi nel nostro array "animali".

 - (NSUInteger) numberOfVisibleItemsInCarousel: (iCarousel *) carousel // limita il numero di visualizzazioni di elementi caricate contemporaneamente (per motivi di prestazioni) return 7; 

Per l'iPhone, vogliamo solo visualizzare fino a 7 articoli alla volta. Questo non è un numero assoluto, ma andrà bene per le prestazioni.

 - (UIView *) carousel: (iCarousel *) carosello viewForItemAtIndex: (NSUInteger) index // crea una vista numerata UIView * view = [[UIImageView alloc] initWithImage: [UIImage imageNamed: [animals objectAtIndex: index]]]; vista di ritorno; 

Questo è un po 'come lavorare con la cella corrente in un UITableView. Qui, impostiamo il contenuto di ciascun elemento del carosello in modo che sia un UIView con un UIImage. UIImage caricherà il file .png per l'animale corrispondente nella serie "animali".

 - (NSUInteger) numberOfPlaceholdersInCarousel: (iCarousel *) carousel // note: le visualizzazioni segnaposto vengono visualizzate solo su alcuni caroselli se il wrapping è disabilitato return 0; 

I segnaposto sono elementi a libro all'inizio e alla fine del nostro gruppo di immagini. Non vogliamo questi, quindi ritorneremo 0. Per curiosità, sentitevi liberi di cambiarlo per restituire 1, ma per il nostro esempio vogliamo lasciarlo così com'è.

 - (CGFloat) carouselItemWidth: (iCarousel *) carousel // di solito questo dovrebbe essere leggermente più largo delle viste dell'articolo restituisce 240; 

Abbastanza auto-esplicativo, questo è quanto spazio darà il carosello a ciascun oggetto. Le nostre immagini hanno una larghezza di 220 px, quindi ho impostato 240 per fornire una spaziatura.

 - (BOOL) carouselShouldWrap: (iCarousel *) carousel // avvolgi tutti i carousels di ritorno avvolgere; 

Questo è impostato su "no" nel nostro metodo "initWithNibName" e impedirà ai nostri articoli di scorrere all'infinito.

 - (void) carouselDidScroll: (iCarousel *) carousel [label setText: [NSString stringWithFormat: @ "% @", [descrizioni objectAtIndex: carousel.currentItemIndex]]]; 

E, infine, questo è il metodo che verrà eseguito quando ci fermeremo su un determinato oggetto. Stiamo impostando il testo della nostra UILable sul contenuto della nostra matrice "Descrizioni" nell'indice corrispondente per il nostro articolo corrente. E questo è tutto per i metodi di iCarousel.

L'ultima cosa che vogliamo fare ora, prima di eseguire la nostra app, è impostare il tipo di stile di visualizzazione del carosello che vogliamo. Possiamo farlo nel metodo "(void) viewDidLoad" impostando il carousel.type sul nostro stile desiderato.

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

Puoi vedere un elenco completo di stili all'inizio di questo articolo o nella pagina github di iCarousel.

E ora vai avanti e costruisci ed esegui la tua app e dovresti vedere un elenco scorrevole di immagini di animali con le descrizioni sottostanti. Ti incoraggio fortemente a giocare con i vari stili e proprietà del carosello, e forse potremo anche guardare all'interattività con gli articoli della giostra in futuro.