Maak een geweldige carrousel, versie 2.0

Betrek uw gebruikers met verbluffende carrousels! We zullen bekijken hoe eenvoudig en schoon het kan zijn om schuifbare, interactieve carrousels in uw iOS-applicaties te implementeren. Met een hoge configureerbaarheid kunt u 3D, platte, roterende en eindeloze schuifmatrices hebben voor gegevens, afbeeldingen en knoppen.

Noot van de redacteur: deze tutorial werd oorspronkelijk in januari gepubliceerd op Mobiletuts +. Deze versie is aanzienlijk bijgewerkt als reactie op wijzigingen in de iCarousel-bibliotheek.


Op 9 januari 2007 onthulde Steve Jobs de iPhone aan een gretig publiek. In zijn presentatie demonstreerde hij veel van de functies die zouden leiden tot een geheel nieuwe manier van interactie met technologie en informatie. Een van die vele functies werd gepresenteerd door een eenvoudige en krachtige boodschap: "raak je muziek aan". Terwijl hij daarboven stond en Bob Dylan de luidsprekers bespeelde, 'bladerde' Steve Jobs moeiteloos door zijn muziekalbums. Die boodschap was duidelijk gemaakt.

Nu, bijna vijf jaar later, is diezelfde boodschap waar. Er is magie in de manier waarop we vandaag door onze muziek kunnen bladeren, en als ontwikkelaars kunnen we diezelfde ervaring aan onze gebruikers aanbieden voor allerlei soorten gegevens, niet alleen voor nummers en albums.

Voor degenen die al bekend zijn met ontwikkelen voor iOS, kan het intimiderend zijn om rekening te houden met het aantal betrokken factoren om iets eenvoudigs te implementeren als Cover Flow: animatie en vloeiend scrollen, het optimaliseren van de afhandeling van afbeeldingen, het onderscheppen van aanraakinteracties, enz..

Gelukkig heeft Nick Lockwood van Charcoal Design een klasse gecreëerd genaamd "iCarousel" die al het zware werk voor ons afhandelt, en hij heeft het vrijgegeven als een open source project. Dit betekent dat we snel en efficiënt kunnen doorgaan met de rest van onze ontwikkeling, terwijl we nog steeds genieten van uiterst interactieve, aanraakvriendelijke Cover Flow.

Een van de geweldige functies van iCarousel is de selectie kant-en-klare schermtypen:

  • iCarouselTypeLinear
  • iCarouselTypeRotary
  • iCarouselTypeInvertedRotary
  • iCarouselTypeCylinder
  • iCarouselTypeInvertedCylinder
  • iCarouselTypeCoverFlow
  • iCarouselTypeCoverflow2
  • en meer…

Het is ook mogelijk om deze stijlen aan te passen aan uw behoeften, maar dat kan een afzonderlijke zelfstudie of Quick Tip zelf zijn (laat het ons weten in de comments als u geïnteresseerd bent!).


Stap 1: iCarousel verkrijgen en instellen

iCarousel wordt gehost op github, wat betekent dat je het kunt krijgen als een git-kloon of als een .zip-download. Je vindt het op https://github.com/nicklockwood/iCarousel, dus ga je gang en koop een lokale kopie van iCarousel.

Dit project omvat ook het gebruik van een paar afbeeldingen, dus u wilt de "Bronbestanden" bovenaan deze pagina downloaden als u dat nog niet hebt gedaan. In dat .zip-bestand is er een map met de naam "Dieren" met zeven verschillende dierenafbeeldingen (deze afbeeldingen komen van Joy Tek op Flickr - http://www.flickr.com/photos/joytek/collections/72157627168953450/) - en de grootte is gewijzigd voor deze zelfstudie).

Nu alle gedownloade bestanden zijn gedownload, zijn we klaar om een ​​geweldige carrousel te maken!

We beginnen met het toevoegen van de iCarousel-klassebestanden en vervolgens de afbeeldingsbestanden. Ten slotte zorgen we ervoor dat de app wordt beperkt tot de liggende modus zonder zichtbare statusbalk (iCarousel werkt in de staande modus, maar we houden het wel eenvoudig door voor nu gewoon met landschap te werken). Maar laten we vóór alles een nieuw project starten!

We hebben slechts één venster nodig voor dit project, dus een "Single View Application" zal voorlopig prima zijn. Ik zal mijn project "Carrousel" noemen en ik zal Automatic Reference Counting (ARC) gebruiken, dus het is belangrijk om die optie niet te vergeten bij het maken van het project.

Zodra ons project is aangemaakt, kunnen we de iCarousel-klassebestanden toevoegen door de "iCarousel" -directory te pakken en naar het project te slepen (er zijn slechts twee bestanden in de iCarousel-directory: "iCarousel.h" en "iCarousel.m"). Opmerking: als u de hele map naar uw project sleept, zorg dan dat u "Groepen maken voor elke toegevoegde map".

iCarousel is afhankelijk van het "QuartzCore" -raamwerk en ondersteunt ARC volledig, dus we hebben een paar eenvoudige taken om ervoor te zorgen dat onze nieuw toegevoegde klasse met ons project werkt.

Om het QuartzCore-raamwerk toe te voegen, klikt u op het projectbestand in de linker navigator (dit is uw projectnaam, de mijne zegt "iCarousel 1target, iPhone OS ..."). Bovenaan het scherm staan ​​nu enkele instellingen voor het maken van doelen. Klik op 'Fasen opbouwen' en vouw vervolgens 'Binaire koppeling met bibliotheken' uit en klik op de knop '+' in de linkerbenedenhoek. Er verschijnt een venster en u kunt ons kader vinden door "QuartzCore" in het zoekvak te typen. Klik op "Toevoegen" en u bent klaar!

We gaan de statusbalk voor deze app uitschakelen, dus ga door naar het tabblad 'Info' voor ons doel en onder 'Aangepaste iOS-doeleigenschappen' zullen we een nieuwe rij toevoegen (klik met de rechtermuisknop ->; rij toevoegen ) en stel de tekst in het veld "Sleutel" in op "Statusbalk is in eerste instantie verborgen". Stel vervolgens de "Waarde" in op "JA".

Voordat we beginnen met de daadwerkelijke implementatie, willen we de oriëntatie van onze app op landschap instellen en ervoor zorgen dat deze niet in portretmodus gaat (althans voorlopig). We gaan gewoon naar het tabblad "Samenvatting" voor ons doel en zorgen ervoor dat de opties "Landschap links" en "Landschap rechts" de enige zijn die zijn geselecteerd onder het gedeelte "Ondersteunde apparaatoriëntatie".

Vervolgens kunnen we naar het implementatiebestand van de hoofdweergavecontroller gaan ("MTViewController.m" voor mij) en de methode wijzigen:

 - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation // Return YES voor ondersteunde oriëntaties retourneren (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 

Het laatste wat we nu moeten doen, is onze foto's van de dieren van de dierentuin in ons project opnemen. Ik heb zeven van dergelijke afbeeldingen opgenomen in de bronbestanden die je kunt gebruiken. Pak ze gewoon waar u de map met bronbestanden uitgepakt hebt en sleep ze naar ons project (u kunt ook gewoon de hele map "Dieren" slepen, die alle afbeeldingen bevat). En nu zijn we klaar om te rollen!


Stap 2: Onze gegevens en carrousel instellen

Onze carrousel zal enkele afbeeldingen van verschillende dierentuindieren laten zien en onder het huidige beeld zullen we de dierennaam tonen en wat voor soort voedsel ze willen eten. In een productieomgeving zou je wat echte data moeten hebben om mee te werken, maar voor ons voorbeeld gaan we gewoon een paar NSArrays opzetten met dummy data.

Onze eerste array zal een lijst zijn van de afbeeldingsnamen, zodat we ze in onze carrousel kunnen vinden en laden. We zullen deze lijst "afbeeldingen" noemen.

De tweede reeks heeft een lijst met namen die overeenkomen met onze afbeeldingen, evenals een kleine zin die dit formaat volgt: [diernaam] Eten: [voedsel]. Met beren zullen we bijvoorbeeld zeggen: "Bears Eat: Honey". We zullen deze array "beschrijvingen" noemen.

We zullen deze NSArrays instellen in ons hoofdbestand-controller-headerbestand ("MTViewController.h" voor mij).

 @property (strong, nonatomic) NSMutableArray * animals; @property (strong, nonatomic) NSMutableArray * beschrijvingen;

En, natuurlijk, synthetiseer ze in ons implementatiebestand:

 @synthetiseren van dieren, beschrijvingen;

We zullen onze set-up uitvoeren in de "initWithNibName" -methode, dus laten we de afbeeldingsnamen en voedselbeschrijvingen nu in hun arrays zetten.

 - (id) initWithNibName: (NSString *) nibNameOrNil-bundel: (NSBundle *) nibBundleOrNil self = [super initWithBibName: nibNameOrNil-bundel: 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", nul]; self.descriptions = [NSMutableArray arrayWithObjects: @ "Bears Eat: Honey", @ "Zebras Eat: Grass", @ "Tigers Eat: Meat", @ "Goats Eat: Weeds", @ "Birds Eat: Seeds", @ " Giraffen Eat: Trees ", @" Chimps Eat: Bananas ", nihil];  terugkeer zelf; 

Je zult merken dat er ook een property "wrap" is, die we hebben ingesteld op "NO". Dit is een iCarousel-eigenschap en het zal ervoor zorgen dat onze carrousel niet in een oneindige lus door onze afbeeldingen schuift, maar in plaats daarvan stopt het met scrollen na de eerste en laatste elementen met een mooie animatie met rubberen banden. We zullen daar later meer op ingaan.

Nu we wat gegevens in onze app hebben, moeten we de eigenlijke iCarousel-klasse implementeren. iCarousel werkt als UITables, met protocollen voor "gegevensbron" en "delegeren". We zullen deze implementeren door eerst de iCarousel-klasse in onze header te importeren.

 #import "iCarousel.h"

Vervolgens voegen we het volgende stukje code toe na het gedeelte "UIViewController" van de interface-declaratie van de header:

 ;

Terwijl we hier zijn, kunnen we ook onze "wrap" -eigenschap toevoegen, die we instellen in onze "initWithNibName" -methode.

 @property (nonatomic) BOOL-wrap;

Nu onze header klaar is, moeten we de UIView en UILabel aansluiten die we nodig hebben om onze carrousel en beschrijvingstekst weer te geven. Dus zullen we ons .xib bestand ("MTViewController.xib" voor mij openen) en onze nieuwe elementen toevoegen.

Voor iCarousel hebben we een UIView nodig. Ik stel de achtergrond van mij in op "Lead", zodat het achter de afbeeldingen mooi en donker zal zijn.

Nu, voor iCarousel om deze UIView als een "iCarousel" -subklasse te herkennen, gaan we naar de "identiteitsinspecteur" en veranderen de "Klasse" in "iCarousel" onder de sectie "Aangepaste klasse". Als we vervolgens met de rechtermuisknop op onze nieuwe UIView klikken, kunnen we onze "dataSource" - en "delegate" -opties naar de "bestandseigenaar" slepen. We moeten ook de "Referencing Outlet" voor onze carrouselweergave instellen op de eigenschap "aCarousel" in de "Eigenaar van het bestand". We zijn bijna klaar met onze iCarousel-weergave, maar eerst zullen we aan ons label werken en dan zullen we beide nieuwe weergaven koppelen aan onze klasse "MTViewController".

Dus ik ga de achtergrond voor het hoofdaanzicht instellen op "Tungsten", wat een lichter grijs gebied zal bieden voor de achtergrond van het label dat de beschrijvingstekst van het geselecteerde dier zal tonen. En dan, natuurlijk, sleep ik over een UILabel en centreer het onder mijn iCarousel UIView.

Met alles op zijn plek, kan ik nu mijn "assistent-editor" openen en eenvoudig met de rechtermuisknop klikken en mijn nieuwe weergaven slepen; eerst de iCarousel-weergave net onder de array "beschrijvingen" in mijn hoofdweergave-headerbestand en dan zal ik hetzelfde doen met mijn UILabel. Ik heb mijn carrouselweergave "carrousel" en mijn label "UILabel" genoemd.

En dat maakt ons werk af met zowel het header-bestand als het .xib-bestand. Samengevat hebben we de iCarousel-klasse geïmporteerd, de iCarousel-gegevensbron en gedelegeerde protocollen toegevoegd en hebben we onze eigenschappen voor de carrousel, het label en de arrays gemaakt.


Stap 3: Alles laten werken

Het iCarousel-protocol ondersteunt een aantal methoden die alle visuele en interactieve elementen van de carrousel behandelen. U kunt hier een volledige referentie vinden van de beschikbare methoden, eigenschappen, enz. Op de github-pagina van iCarousel: https://github.com/nicklockwood/iCarousel. Voor nu echter, moeten we onze arrays instellen als de gegevens voor onze carrousel, en moeten we het gedrag van de carrousel configureren zoals we het willen.

Voor dit voorbeeld zijn dit de iCarousel-methoden die we zullen gebruiken:

 - (NSUInteger) numberOfItemsInCarousel: (iCarousel *) carrousel return [dieren tellen]; 

We stellen het totale aantal elementen in als het aantal items in onze array "animals".

 - (NSUInteger) numberOfVisibleItemsInCarousel: (iCarousel *) carrousel // beperk het aantal items dat gelijktijdig is geladen (om prestatieredenen); retourneer 7; 

Voor de iPhone willen we maximaal 7 items tegelijkertijd weergeven. Dit is geen absoluut aantal, maar is goed voor de prestaties.

 - (UIView *) carrousel: (iCarousel *) carrouselweergaveForItemAtIndex: (NSUInteger) index // maak een genummerde weergave UIView * view = [[UIImageView-toewijzing] initWithImage: [UIImage imageNamed: [animals-objectAtIndex: index]]]; terugkeer bekijken; 

Dit lijkt veel op werken met de huidige cel in een UITableView. Hier stellen we de inhoud van elk carrouselitem in als een UIView met een UIImage. De UIImage laadt de .png voor het overeenkomstige dier in de array "animals".

 - (NSUInteger) numberOfPlaceholdersInCarousel: (iCarousel *) carrousel // note: tijdelijke weergaven worden alleen op sommige carrousels weergegeven als wrapping is uitgeschakeld return 0; 

Placeholders zijn boekensteunitems aan het begin en het einde van onze afbeeldingengroep. We willen deze niet, dus zullen we terugkeren 0. Omwille van de nieuwsgierigheid, voel je vrij om daar verandering in te brengen 1, maar voor ons voorbeeld willen we het laten zoals het is.

 - (CGFloat) carrouselItemWidth: (iCarousel *) carrousel // meestal moet dit iets breder zijn dan de itemweergaven terug 240; 

Vrij vanzelfsprekend, dit is hoeveel ruimte de carrousel aan elk item zal geven. Onze afbeeldingen zijn 220 px breed, dus ik heb dit ingesteld op 240 om wat ruimte te bieden.

 - (BOOL) carrouselShouldWrap: (iCarousel *) carrousel // verpak alle carrousels retourfolie; 

Dit is ingesteld op "nee" in onze "initWithNibName" -methode en zal voorkomen dat onze items oneindig scrollen.

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

En, tot slot, dit is de methode die wordt uitgevoerd wanneer we stoppen bij een bepaald item. We stellen de tekst van onze UILable in op de inhoud van onze array met beschrijvingen in de overeenkomende index voor ons huidige item. En dat is het voor de iCarousel-methoden.

Het laatste dat we nu willen doen voordat we onze app gebruiken, is om het type carrouselzichtstijl in te stellen dat we willen hebben. We kunnen dit doen in de "(void) viewDidLoad" -methode door het carousel.type in onze gewenste stijl in te stellen.

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

U kunt een volledige lijst met stijlen zien aan het begin van dit artikel of op de github-pagina van iCarousel.

En nu, ga je gang en bouw en run je app en je zou een doorrolbare lijst van dierenfoto's met beschrijvingen eronder moeten zien. Ik raad je ten zeerste aan om met de verschillende stijlen en eigenschappen van de carrousel te spelen, en misschien kunnen we in de toekomst zelfs kijken naar interactiviteit met carrouselitems..