Creați un Carusel Awesome, versiunea 2.0

Implicați-vă utilizatorii cu caruseluri uimitoare! Vom analiza cât de ușor și curat poate fi implementarea caruselilor scrollabile și interactive în aplicațiile dvs. iOS. Cu configurabilitate ridicată, puteți avea rețele 3D, plane, rotative și nesfârșite de defilare pentru date, imagini și butoane.

Nota Editorului: Acest tutorial a fost publicat inițial pe Mobiletuts + în ianuarie. Această versiune a fost actualizată în mod semnificativ ca răspuns la modificările aduse bibliotecii iCarousel.


Pe data de 9 ianuarie 2007, Steve Jobs a lansat iPhone-ul pentru un public dornic. În prezentarea sa, el a demonstrat multe dintre trăsăturile care ar continua să creeze un mod complet nou de interacțiune cu tehnologia și informația. Una dintre aceste multe caracteristici a fost prezentată printr-un mesaj simplu și puternic: "atingeți muzica". În timp ce se ridică acolo, cu Bob Dylan jucând peste difuzoare, Steve Jobs "a zburat" prin albumele muzicale fără efort. Acest mesaj fusese clarificat.

Acum, aproape cinci ani mai târziu, același mesaj este adevărat. Există magie în modul în care suntem capabili să navigăm în muzica noastră astăzi și, în calitate de dezvoltatori, suntem capabili să aducem aceeași experiență utilizatorilor noștri pentru toate tipurile de date, nu doar pentru cântece și albume.

Pentru cei care sunt deja familiarizați cu dezvoltarea pentru iOS, ar putea fi intimidantă să ia în considerare numărul de factori implicați în punerea în aplicare a unui lucru ca fiind simplu simplu ca Cover Flow: animație și derulare ușoară, optimizarea manipulării imaginilor, interceptarea interacțiunilor tactile etc..

Din fericire, Nick Lockwood de la Charcoal Design a creat o clasă numită "iCarousel", care se ocupă de toate ridicările grele pentru noi și a lansat-o ca un proiect open source. Asta inseamna ca putem ajunge rapid si eficient la restul dezvoltarii noastre, in timp ce ne bucuram in acelasi timp de un flux interactiv,.

Una dintre marile caracteristici ale iCarousel este selecția tipurilor de afișaj gata de utilizare:

  • iCarouselTypeLinear
  • iCarouselTypeRotary
  • iCarouselTypeInvertedRotary
  • iCarouselTypeCylinder
  • iCarouselTypeInvertedCylinder
  • iCarouselTypeCoverFlow
  • iCarouselTypeCoverflow2
  • și altele…

De asemenea, este posibil să personalizați aceste stiluri pentru a se potrivi nevoilor dvs., dar ar putea fi un tutorial separat sau un sfat rapid în sine (anunțați-ne în comentarii dacă sunteți interesat!).


Pasul 1: Obținerea iCarusel și configurarea

iCarousel este găzduit pe github, ceea ce înseamnă că o puteți obține fie ca o clonă git, fie ca o descărcare .zip. Puteți găsi acest lucru la https://github.com/nicklockwood/iCarousel, deci mergeți mai departe și obțineți-vă o copie locală a iCarousel.

Acest proiect implică și utilizarea câtorva imagini, așa că veți dori să descărcați "Fișierele sursă" în partea de sus a acestei pagini, dacă nu ați făcut-o deja. În acest fișier .zip există un director numit "Animale" care are șapte imagini diferite pe animale (aceste imagini provin de la Joy Tek pe Flickr - http://www.flickr.com/photos/joytek/collections/72157627168953450/) - și au fost redimensionate pentru acest tutorial).

Acum, cu toate fișierele necesare descărcate, suntem gata să creăm un carusel minunat!

Vom începe prin adăugarea fișierelor de clasă iCarousel, apoi a fișierelor imagine și, în final, vom limita aplicația în modul peisaj fără o bară de stare vizibilă (iCarousel va funcționa în modul portret, dar îl vom păstra simplu doar prin lucrul cu peisajul pentru moment). Dar, înainte de toate, să începem un nou proiect!

Avem nevoie doar de o singură fereastră pentru acest proiect, așa că o aplicație "Single View" va fi bine pentru moment. O să-mi sun proiectul "Carusel" și voi folosi automat numărarea de referință (ARC), deci este important să nu uitați acea opțiune când creați proiectul.

Odată ce proiectul nostru a fost creat, putem adăuga fișierele clasei iCarousel prin apucarea directorului "iCarousel" și tragerea acestuia în proiect (în directorul iCarousel există doar două fișiere: "iCarousel.h" și "iCarousel.m"). Notă: dacă glisați întregul director în proiect, asigurați-vă că "Creați grupuri pentru orice dosare adăugate".

iCarousel depinde de cadrul "QuartzCore" și sprijină pe deplin ARC, așa că avem câteva sarcini simple de făcut pentru a ne asigura că clasa nouă adăugată va funcționa împreună cu proiectul nostru.

Pentru a adăuga cadrul QuartzCore, faceți clic pe fișierul de proiect din navigatorul din stânga (acesta va fi numele proiectului dvs., al meu spune "iCarousel 1target, iPhone OS ..."). În partea de sus a ecranului, veți avea acum câteva setări pentru construirea țintă. Faceți clic pe "Construiți fazele" și apoi extindeți "Link Binary With Libraries" și faceți clic pe butonul "+" din colțul din stânga jos. Va apărea o fereastră și veți găsi cadrul nostru introducând "QuartzCore" în caseta de căutare. Faceți clic pe "Adăugați" și ați terminat!

Vom dezactiva bara de stare pentru această aplicație, așa că mergeți la fila "Info" pentru destinația noastră, iar în secțiunea "Proprietăți țintă personalizate iOS" vom adăuga un nou rând (Clic dreapta ->; Adăugați rând ) și setați textul în câmpul "Cheie" la "Bara de stare este inițial ascunsă". Apoi, setați "Valoare" la "DA".

Acum, înainte de a intra în implementarea reală, dorim să setăm orientarea aplicației noastre pe peisaj și să ne asigurăm că aceasta nu intră în modul portret (cel puțin pentru moment). Vom merge la fila "Rezumat" pentru obiectivul nostru și vă asigurați că opțiunile "Peisaj stânga" și "Peisaj dreapta" sunt singurele opțiuni selectate în secțiunea "Orientări dispozitiv orientate".

Apoi, putem să accesăm fișierul de implementare a controlerului principal ("MTViewController.m" pentru mine) și să modificăm metoda:

 - (BOOL) ar trebui să fieAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfațăOrientation // Return YES pentru întoarcerea orientărilor acceptate (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIIterfaceOrientationLandscapeRight); 

Ultimul lucru pe care trebuie să-l facem pentru moment este să ne aducem imaginile animalelor din grădinile zoologice în proiectul nostru. Am inclus șapte astfel de imagini în fișierele sursă pentru a le utiliza. Doar apucați-le de unde ați dezarhivat directorul fișierelor sursă și trageți-le în proiectul nostru (de asemenea, puteți trage întregul director "Animale", care va include toate imaginile). Și acum suntem gata să ne întoarcem!


Pasul 2: Configurarea datelor noastre și carusel

Caruselul nostru va afișa câteva imagini ale animalelor zoologice diferite, iar sub imaginea curentă vom arăta numele animalului și ce fel de mâncare le place să mănânce. Într-un mediu de producție, ar trebui să aveți date reale cu care să lucrați, dar, pentru exemplul nostru, vom stabili doar câteva ANS-uri cu date fictive.

Prima noastră matrice va fi o listă cu numele imaginilor, astfel încât să le putem găsi și încărca în caruselul nostru. Vom numi această listă "imagini".

A doua matrice va avea o listă de nume care corespund imaginilor noastre, precum și o propoziție mică care urmează acest format: [animal name] Mănâncă: [food]. De exemplu, cu urșii, vom spune: "Ursii mănâncă: dragă". Vom numi această "descriere".

Vom configura aceste NSArrays în fișierul header header principal al controlerului ("MTViewController.h" pentru mine).

 @ proprietăți (animale puternice, nonatomice) NSMutableArray *; @property (puternice, nonatomice) NSMutableArray * descrieri;

Și, bineînțeles, sintetizați-le în fișierul nostru de implementare:

 @intetizarea animalelor, descrieri;

Vom face setarea în metoda "initWithNibName", așa că să punem acum numele de imagine și descrierile produselor alimentare în matricea lor.

 - (id) initWithNibName: (NSString *) pachet nibNameOrNil: (NSBundle *) nibBundleOrNil auto = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; dacă (auto) // configurați carusel data wrap = NO; auto.animale = [NSMutableArray arrayWithObjects: @ "Bear.png", @ "Zebra.png", @ "Tiger.png", @ "Goat.png", "Birds.png", @ "Giraffe.png" @ "Chimp.png", nul]; self.descriptions = [NSMutableArray arrayWithObjects: @ "Băuturi mănâncă: Miere", @ "Mănâncă Zebras: Iarbă", @ "Tigrii mănâncă: Carne" Girafe Mănâncă: Copaci ", @" Chimps Mănâncă: Banane ", nil];  întoarce-te; 

Veți observa că există și o "wrap" de proprietate, pe care am setat-o ​​la "NU". Aceasta este o proprietate iCarousel și se va asigura că caruselul nostru nu derulează într-o buclă infinită prin imaginile noastre, dar în schimb se oprește să deruleze după primul și ultimul element cu o animație frumoasă cu bandă de cauciuc. Vom analiza mai târziu.

Acum, când avem unele date în aplicația noastră, va trebui să implementăm clasa iCarousel actuală. iCarousel funcționează ca UITables, cu protocoale "sursă de date" și "delegate". Vom implementa aceste metode prin importarea în primul rând a clasei iCarousel în antetul nostru.

 #import "iCarousel.h"

Apoi, vom adăuga următorul fragment de cod după secțiunea "UIViewController" a declarației de interfață antet:

 ;

În timp ce suntem aici, putem adăuga proprietatea "wrap", pe care o stabilim în metoda noastră "initWithNibName".

 @property (nonatomic) wrap BOOL;

Acum, cu antetul nostru gata, trebuie să conectăm UIView și UILabel că va trebui să afișăm caruselul și textul descrierii. Deci, vom deschide fișierul .xib ("MTViewController.xib" pentru mine) și vom adăuga noile noastre elemente.

Pentru iCarousel, avem nevoie de o vizualizare UIV. Am setat fundalul meu pe "Lead", astfel încât să fie frumos și întunecat în spatele imaginilor.

Acum, pentru ca iCarousel să recunoască această subdiviziune UIView ca o subclasă "iCarousel", vom merge la "inspectorul de identitate" și vom schimba "Class" la "iCarousel" în secțiunea "Custom Class". Apoi, dacă faceți clic dreapta pe noua noastră vizualizare UIView, putem trage opțiunile "dataSource" și "delegate" peste "Proprietarul fișierului". De asemenea, va trebui să setăm opțiunea "Referencing Outlet" pentru vizualizarea caruselului la proprietatea "aCarousel" din "Proprietarul fișierului". Aproape am terminat cu viziunea noastră iCarousel, dar mai întâi vom lucra pe eticheta noastră și apoi vom creea ambele vederi noi până la clasa noastră "MTViewController".

Deci, voi seta fundalul pentru vizualizarea principală la "Tungsten", care va oferi o zonă gri mai deschisă pentru fundalul etichetei care va afișa textul descrierii animalului selectat. Și apoi, bineînțeles, o să trag deasupra unei UILabel și să o pun în centrul ei sub uCarousel UIView.

Cu totul în loc, pot să-mi deschid "Asistentul Editor" și să dau ușor clic dreapta și să-mi trag noua vedere; mai întâi vizualizarea iCarousel aflată chiar sub matricea "descrieri" din fișierul antet principal al vederii și apoi voi face același lucru cu UILabelul meu. Mi-am denumit caruselul "carusel", iar eticheta mea ".

Și asta ne termină lucrarea cu fișierul antet, precum și fișierul .xib. În concluzie, am importat clasa iCarousel, am adăugat protocoalele iCarousel dataSource și delegate și am creat proprietățile noastre pentru carusel, etichetă și matrice.


Pasul 3: Faceți totul de lucru

Protocolul iCarousel acceptă o serie de metode care se ocupă de toate elementele vizuale și interactive ale caruselului. Puteți găsi o referință completă a metodelor disponibile, a proprietăților etc. pe pagina iCarousel github aici: https://github.com/nicklockwood/iCarousel. Pentru moment, totuși, trebuie să luăm matricele noastre ca date pentru caruselul nostru, precum și să obținem comportamentul pentru carusel configurat cum ne dorim.

Pentru acest exemplu, acestea sunt metodele iCarousel pe care le vom folosi:

 - (NSUInteger) numberOfItemsInCarousel: (iCarousel *) carusel retur [numărul animalelor]; 

Vom determina numărul total de elemente să fie numărul de elemente din matricea "animale".

 - (NSUInteger) numberOfVisibleItemsInCarousel: (iCarousel *) carusel // limita numărului de afișări de elemente încărcate simultan (din motive de performanță) retur 7; 

Pentru iPhone, dorim să afișăm până la 7 articole simultan. Acesta nu este un număr absolut, dar va fi bun pentru performanță.

 - (UIView *) carusel: (iCarousel *) vizualizare caruselForItemAtIndex: (NSUInteger) index // creare vizualizare numerotata UIView * view = [[UIImageView alloc] initWithImage: [UImage imageNamed: [animal objectAtIndex: index]]; retur; 

Acest lucru este foarte asemănător cu lucrul cu celula curentă într-un UITableView. Aici, setăm conținutul fiecărui element carusel pentru a fi UIView cu un UIImage. UIImage va încărca .png pentru animalul corespunzător din matricea "animale".

 - (NSUInteger) numberOfPlaceholdersInCarousel: (iCarousel *) carusel // notă: vizualizările de locașuri sunt afișate numai pe unele caruseluri dacă împachetarea este dezactivată return 0; 

Reprezentantele sunt elemente de tip bookend la începutul și la sfârșitul grupului nostru de imagini. Nu vrem aceste lucruri, așa că vom reveni la zero. Din motive de curiozitate, nu ezitați să schimbați acest lucru pentru a reveni la 1, dar pentru exemplul nostru dorim să îl lăsăm așa cum este.

 - (CGFloat) carouselItemWidth: (iCarousel *) carusel // de obicei, acest lucru ar trebui să fie puțin mai lărgit decât punctul de vedere al elementului 240; 

Destul de explicativ, acesta este cât spațiu va oferi caruselul fiecărui element. Imaginile noastre au o lățime de 220 de pixeli, așadar am stabilit acest lucru la 240 pentru a oferi spațiu.

 - (BOOL) carouselShouldWrap: (iCarousel *) carusel // înfășurați toate carusele return wrap; 

Acesta este setat la "nu" în metoda noastră "initWithNibName" și ne va împiedica să derulam articolele infinit.

 - (void) carouselDidScroll: (iCarousel *) carusel [setText etichetă: [NSString stringWithFormat: @ "% @", [descriptions objectAtIndex: carousel.currentItemIndex]]; 

Și, în sfârșit, aceasta este metoda care va funcționa atunci când ne oprim la un element dat. Am setat textul nostru UILable la conținutul matricei noastre de "descrieri" la indexul corespunzător pentru elementul nostru curent. Și asta este pentru metodele iCarousel.

Ultimul lucru pe care vrem să îl facem acum, înainte de a rula aplicația noastră, este să setăm tipul de stil de vizualizare a caruselului pe care îl dorim. Putem face acest lucru în metoda "(void) viewDidLoad" prin setarea carusel.type la stilul dorit.

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

Puteți vedea o listă completă de stiluri la începutul acestui articol sau la pagina de grubu iCarousel.

Și acum, continuați și construiți și rulați aplicația dvs. și ar trebui să vedeți o listă scrollabilă a imaginilor de animale cu descrieri de dedesubt. Vă încurajez foarte mult să jucați cu diferitele stiluri și proprietăți ale caruselului și, poate, chiar să ne uităm la interactivitatea cu obiecte carusel în viitor.

Cod