Animated Komponenter med UIKit Dynamics: Part 2
44
Del
8
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Innledning
I den første opplæringen av denne korte serier på UIKit Dynamics, vi lærte det grunnleggende API ved å lage en animert meny komponent. I denne opplæringen, vil vi jobbe videre med vårt prosjekt og implementere en annen animert komponent, et tilpasset varsel utsikt.
1. Oversikt
Standard varsling syn på iOS er flott, men det er ikke veldig tilpasses når det gjelder utseende og oppførsel. Hvis du trenger et varsel syn som er passelig, så du trenger for å lage din egen løsning, og det er det vi skal gjøre i denne opplæringen. Fokus for denne opplæringen er på oppførselen til varsling utsikt og ikke så mye på funksjonaliteten. La oss se hva resultatet er at vi er ute etter
alert visningen vil være en UIView eksempel som vi vil legge til følgende subviews:
a UILabel objekt for visning av varsling utsikt tittel
a UILabel objekt for visning varsel utsikt budskap
en eller flere UIButton instanser for å la brukeren kommuniserer med en våken utsikt
Vi bruke UISnapBehavior klassen å presentere varselet visning. Som navnet indikerer, tvinger dette UIDynamicBehavior underklasse et dynamisk element for å knipse til et punkt som om det ble magnetisk trukket til den.
UISnapBehavior klassen definerer én ekstra eiendom, demping, som definerer hvor mye pendling når dynamiske elementet har nådd det punktet som den er tiltrukket.
Vi vil bruke en tyngdekraft atferd, i kombinasjon med en kollisjon og presse atferd, for å avvise varselet visning. Husk at vi allerede brukt disse atferd i forrige tutorial.
alert visningen vil animere inn fra toppen av skjermen. Når varselet syn er i ferd med å dukke opp, vil snap oppførsel gjør det slippe inn utsikten og smekk til midten av skjermen. Å avvise varselet syn, vil en push atferd skyver den til bunnen av skjermen og en tyngdekraft atferd vil da trekke den til toppen av skjermen, og gjøre det animere off-screen.
Vi lage en ny tilpasset initialisering metode for varsling visning komponent som aksepterer varselet tittel, budskap, knapp titler, og moder visning. Vi vil ikke være å implementere en delegat protokoll for varsling visningen. I stedet vil vi gjøre bruk av blokker, noe som gir et mer elegant og moderne løsning. Blokken eller behandleren vil akseptere to parametre, indeksen og tittelen på knappen brukeren avlyttet.
Vi vil også vise en semi-transparent utsikt bak varselet sikte på å hindre brukeren i samspill med foreldrene sine se så lenge våken utsikten er synlig. La oss begynne med å ta en titt på en våken vise egenskaper og skikken initializer.
2. Egenskaper og initialisering
Trinn 1: Opprette Alert Vis Class
Trykk Kommando-N
på tastaturet for å opprette en ny fil og velge Objective-C klasse fra listen av iOS
maler. Gjør det til en underklasse av NSObject og name it AlertComponent
Trinn 2:. Erklærte Properties
Det neste trinnet er å erklære noen private eiendommer. Åpne AlertComponent.m
, legge en klasse forlengelse på toppen, og erklærer følgende egenskaper:
interface AlertComponent ()property (nonatomic, sterk) UIView * alertView;property (nonatomic, sterk ) UIView * backgroundView;property (nonatomic, sterk) UIView * targetView;property (nonatomic, sterk) UILabel * titleLabel;property (nonatomic, sterk) UILabel * messageLabel;property (nonatomic, sterk) UIDynamicAnimator * animatør; @ eiendom (nonatomic, sterk) NSString * tittel;property (nonatomic, sterk) NSString * melding;property (nonatomic, sterk) NSArray * buttonTitles;property (nonatomic) CGRect initialAlertViewFrame;end
Funksjonen til hver enkelt eiendom vil bli klart når vi gjennomføre varsling komponent. Det er på tide å skape komponentens tilpasset initializer
Trinn 3:. Initialisering
Som jeg allerede har nevnt, kommer vi til å bruke en tilpasset initializer å gjøre arbeidet med varsling komponent så enkelt som mulig . Den initializer godtar fire parametere, varsling tittel, dens budskap, knappe titler, og vise til hvilke varsel komponenten vil bli lagt til, moder utsikt. Åpne AlertComponent.h Hotell og legge til følgende erklæring:
interface AlertComponent: NSObject- (id) initAlertWithTitle: (NSString *) tittel andMessage: (NSString *) beskjed andButtonTitles: (NSArray *) buttonTitles andTargetView : (UIView *) targetView;end
3. Sette opp Alert Vis
Trinn 1: Erklærte Setup Metoder
I denne delen varselet syn kommer til å bli satt opp, og alle dets subviews vil bli lagt til det. Også bakgrunnen utsikt, samt den dynamiske animatør vil bli satt opp for
Åpne AlertComponent.m Hotell og erklærer følgende private metoder i privat klasse forlengelse.
@ grensesnitt AlertComponent () ...- (void) setupBackgroundView, - (void) setupAlertView;end
De metodenavn er selvforklarende. La oss starte med å implementere setupAlertView metoden først, siden de fleste av varselet oppsett foregår i denne metoden
Trinn 2:. Sette opp Alert Vis
I setupAlertView, vi gjøre tre ting:
initial og konfigurere varsling visning
initial og konfigurere varsling vise etiketter
initial og konfigurere varsling vise knapper
La oss starte ved å beregne varselet visning størrelse og plassering som vist i kodebiten under Anmeldelser -. (void) setupAlertView {//Sett størrelsen av varselet visning. CGSize alertViewSize = CGSizeMake (250,0, 130,0 + 50,0 * self.buttonTitles.count); //Sett innledende opprinnelse punkt avhengig av retningen av varselet visning. CGPoint initialOriginPoint = CGPointMake (self.targetView.center.x, self.targetView.frame.origin.y - alertViewSize.height);}
Vi starter ved å sette en våken visningens størrelse. For å gjøre en våken utsikt dynamisk, legger vi 50,0 poeng til sin høyde for hver knapp. Legg også merke til at den opprinnelige opphavet til varsling visningen er off-screen. Det neste trinnet er initialisert og sette opp varsel visningen:
self.alertView = [[UIView alloc] initWithFrame: CGRectMake (initialOriginPoint.x, initialOriginPoint.y, alertViewSize.width, alertViewSize.height)]; //bakgrunnsfarge . [self.alertView setBackgroundColor: [UIColor colorWithRed: 0,94 grønt: 0,94 blå: 0.94 alpha: 1.0]];. //Gjør varselet visning med avrundede hjørner [self.alertView.layer setCornerRadius: 10,0]; //Sett en grense til varsling view [self.alertView.layer setBorderWidth: 1,0];. [self.alertView.layer setBorderColor: [UIColor blackColor] .CGColor]; //Tildele den første varselet visning ramme til det aktuelle eiendommen. self.initialAlertViewFrame = self.alertView.frame;
Ved hjelp alertViewSize og initialOriginPoint, initial vi alertView objektet og angi bakgrunnsfarge. Vi avrunder varselet vise hjørner ved å sette sitt lags cornerRadius til 10,0, det borderWidth til 1,0, og dens borderColor til svart. Vi lagrer også en våken utsikt opprinnelige rammen i sin initialAlertViewFrame eiendom som vi vil være behov for det senere.
Hvis Xcode forteller deg at det ikke vet om alertView er lag eiendom, deretter til følgende import uttalelse på toppen av gjennomføringen filen:
#import < QuartzCore /QuartzCore.h >
Det er på tide å legge til etikettene. La oss starte med tittelen etiketten
//Setup tittelen label.self.titleLabel = [[UILabel alloc] initWithFrame: CGRectMake (0,0, 10,0, self.alertView.frame.size.width, 40,0)];. [Selvtillit .titleLabel setText: self.title] [self.titleLabel setTextAlignment: NSTextAlignmentCenter] [self.titleLabel setfont: [UIFont fontWithName: @ "Avenir-Heavy" størrelse: 14,0]]; //Legg tittelen etiketten til varsling visning . [self.alertView addSubview: self.titleLabel];
Sette opp meldingen etiketten er ganske lik
//Setup meldingen label.self.messageLabel = [[UILabel alloc] initWithFrame: CGRectMake (0.0, self. .titleLabel.frame.origin.y + self.titleLabel.frame.size.height, self.alertView.frame.size.width, 80,0)] [self.messageLabel setText: self.message] [self.messageLabel setTextAlignment: NSTextAlignmentCenter] [self.messageLabel setfont: [UIFont fontWithName: @ "Avenir" størrelse: 14.0]]; [self.messageLabel setNumberOfLines: 3] [self.messageLabel setLineBreakMode: NSLineBreakByWordWrapping]; //Legg meldingen etiketten til varsling . vis [self.alertView addSubview: self.messageLabel];.
Merk at numberOfLines eiendommen er satt til tre og lineBreakMode er satt til NSLineBreakByWordWrapping
Det siste vi trenger å sette opp er varselet visningens knapper. Selv om antall knapper kan variere, sette opp og plassere knappene er ganske enkel. Vi skille knappene med 5 poeng og bruke en for loop å initial dem
CGFloat lastSubviewBottomY = self.messageLabel.frame.origin.y + self.messageLabel.frame.size.height;. For (int i = 0; i < [self.buttonTitles telle]; i ++) {UIButton * -knappen = [[UIButton alloc] initWithFrame: CGRectMake (10,0, lastSubviewBottomY + 5,0, self.alertView.frame.size.width - 20,0, 40,0)]; [knapp setTitle: [self.buttonTitles objectAtIndex: i] forState: UIControlStateNormal]; [button.titleLabel setfont: [UIFont fontWithName: @ "Avenir" størrelse: 13,0]]; [knapp setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]; [knapp setTitleColor: [UIColor yellowColor] forState: UIControlStateHighlighted]; [knapp setBackgroundColor: [UIColor colorWithRed: 0.0 grønt: 0,47 blå: 0.39 alpha: 1.0]]; [knapp addTarget: selv handling:selector (handleButtonTap :) forControlEvents: UIControlEventTouchUpInside]; [knapp setTag: i + 1]; [self.alertView addSubview: knapp]; lastSubviewBottomY = button.frame.origin.y + button.frame.size.height;}
Legg merke til at hver knapp påkaller handleButtonTap: metode når det er tappet. Vi kan bestemme hvilken knapp brukeren tappet ved å inspisere knappens tag eiendom
Til slutt legger varselet utsikt til målet eller forelder visning ved å legge til følgende linje nederst på setupAlertView metode. Twitter /. /Legg varselet utsikt til den overordnede syn [self.targetView addSubview: self.alertView];
Trinn 3: Sette opp bakgrunns Vis
Den andre metoden vi trenger for å implementere er setupBackgroundView. Bakgrunnen visningen vil hindre brukeren i samspill med varselet utsikt ordnede syn så lenge våken visningen vises. Vi i utgangspunktet satt sin alpha eiendom til 0,0, noe som betyr at det er gjennomsiktige Anmeldelser - (void) setupBackgroundView {self.backgroundView = [[UIView alloc] initWithFrame: self.targetView.frame].; [self.backgroundView setBackgroundColor: [UIColor grayColor]]; [self.backgroundView setAlpha: 0.0]; [self.targetView addSubview: self.backgroundView];}
Trinn 4:. Implementering av initializer
Med setupAlertView og setupBackgroundView klar til bruk, la oss gjennomføre tilpasset initializer vi erklært tidligere Anmeldelser - (id ) initAlertWithTitle: (NSString *) tittel andMessage: (NSString *) beskjed andButtonTitles: (NSArray *) buttonTitles andTargetView: (UIView *) targetView {if (selv = [super init]) {//Gi parameterverdier til lokale egenskaper. self.title = tittel; self.message = melding; self.targetView = targetView; self.buttonTitles = buttonTitles; //Setup bakgrunnen visning. [selvtillit setupBackgroundView]; //Setup varselet visning. [selvtillit setupAlertView]; //Setup animatøren. self.animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.targetView]; } Returnere selv;}
Vi setter tittelen, melding, targetView og buttonTitles egenskaper, påberope setupBackgroundView og setupAlertView, og initialisere dynamisk animatør, passerer i self.targetView som sin referansevisningen
4.. Viser den Alert Vis
For å vise varselet visningen etter at den er initialisert, trenger vi å erklære og gjennomføre en offentlig metode som kan kalles ved, for eksempel, utsikten controller hosting varselet visning. Åpne AlertComponent.h Hotell og legge til følgende metode erklæring: Anmeldelser - (void) showAlertView;
Leder tilbake til AlertComponent.m
å implementere showAlertView. Som jeg nevnte tidligere i denne opplæringen, vil vi være i bruk et nytt UIDynamicBehavior underklasse vise varselet visning, UISnapBehavior. La oss se hvordan vi bruker denne klassen i showAlertView Anmeldelser - (void) showAlertView {[self.animator removeAllBehaviors].; UISnapBehavior * snapBehavior = [[UISnapBehavior alloc] initWithItem: self.alertView snapToPoint: self.targetView.center]; snapBehavior.damping = 0,8; [self.animator addBehavior: snapBehavior]; [UIView animateWithDuration: 0,75 animasjoner: ^ {[self.backgroundView setAlpha: 0,5]; }];}
Vi starter med å fjerne eventuelle eksisterende dynamiske atferd fra den dynamiske animator å sikre at ingen konflikter dukker opp. Husk at noen dynamiske atferd kan kun påføres når den dynamiske animatør, for eksempel en tyngdekraft atferd. Dessuten vil vi legge til andre dynamiske atferd for å avvise varselet utsikt.
Som du kan se, ved hjelp av et blunk oppførsel er ikke vanskelig. Vi spesifiserer hvilke dynamiske elementet atferden skal brukes til og sette det punktet den dynamiske elementet skal knipse. Vi har også satt oppførselen sin demping eiendom som vi snakket om tidligere. Merk også at vi animere alfa eiendom bakgrunnen visningen.
For å teste varselet visning, må vi gjøre noen endringer i ViewController klassen. La oss begynne med å legge en UIButton eksempel til visningen kontrolleren syn å vise varselet visning. Åpne Main.storyboard Hotell og dra en UIButton eksempel fra objektbiblioteket til visningen kontrolleren syn. Plasser knappen nederst på visningen, og gi den en tittel på Vis Alert Vis
. Legg en handling for å ViewController.h
som vist nedenfor
interface ViewController: UIViewController- (IBAction) showAlertView:. (Id) avsender;end
Leder tilbake til storyboard og koble utsikten kontrollerens handling til knappen. Åpne ViewController.m Hotell og importere header fil av AlertComponent klassen.
#import "AlertComponent.h"
Deretter erklærer en eiendom i privat klasse forlengelse av typen AlertComponent og name it alertComponent .
interface ViewController ()property (nonatomic, sterk) MenuComponent * menuComponent;property (nonatomic, sterk) AlertComponent * alertComponent, - (void) VisMeny: (UIGestureRecognizer *) gestureRecognizer;end
Vi initial varselet komponent i visningen kontrollerens viewDidLoad metode Anmeldelser - (void) viewDidLoad {... //Initial Alert Component self.alertComponent = [[AlertComponent alloc] initAlertWithTitle:. @ "Custom Alert" andMessage: @ "Du har en ny e-postmelding, men jeg vet ikke fra hvem. " andButtonTitles: @ [@ "Vis meg", @ "jeg bryr meg ikke", @ "For meg, egentlig?"] andTargetView: self.view];}
For å vise varselet komponent, påberope showAlertView: i handling vi nettopp opprettet, showAlertView :. Anmeldelser - (IBAction) showAlertView: (id) avsender {[self.alertComponent showAlertView];}
Kjør søknaden din og trykk på knappen for å vise varselet visning. Resultatet skal ligne på den nedenfor.
5. Skjule Alert Vis
Som vi så tidligere, handleButtonTap: er metoden påberopes når brukeren kraner en knapp av varselet visning. Varselet syn bør gjemme seg når en av knappene er avlyttet. La oss se hvordan dette fungerer
Revidere AlertComponent.m Hotell og, i privat klasse forlengelse, erklære handleButtonTap:.. Metode
interface AlertComponent () ... - (void) handleButtonTap: (UIButton *) sender;end
I denne metoden, skaper vi en rekke dynamiske atferd og legge dem til den dynamiske animatør objektet. De dynamiske atferd vi trenger er:
en tyngdekraft oppførsel som trekker varselet utsikt mot toppen av skjermen
en kollisjon atferd med en off-screen grense som stopper varselet visning
en push adferd som gir en våken utsikt lite dytt mot bunnen av skjermen
Etter å ha fjernet de eksisterende atferd fra den dynamiske animatør og initial push atferd som vist nedenfor.
- (void) handleButtonTap: (UIButton *) avsender {//Fjern alle atferd fra animatør. [self.animator removeAllBehaviors]; UIPushBehavior * pushBehavior = [[UIPushBehavior Alloc] initWithItems: @ [self.alertView] -modus: UIPushBehaviorModeInstantaneous]; [pushBehavior setAngle: M_PI_2 magnitude: 20,0]; [self.animator addBehavior: pushBehavior];}
Vinkelen eiendom push atferd definerer retning av push. Ved å sette vinkelen til M_PI_2, er kraften av push atferd rettet mot bunnen av skjermen.
Det neste trinnet er å legge alvoret atferd. Vektoren vi passerer til setGravityDirection vil resultere i en kraft mot toppen av skjermen, trekke varselet utsikt oppover
UIGravityBehavior * gravityBehavior = [[UIGravityBehavior Alloc] initWithItems: @ [self.alertView]] [gravityBehavior setGravityDirection.: CGVectorMake (0,0, -1,0)] [self.animator addBehavior. gravityBehavior];
Hva er interessant om kollisjonen atferd er at vi definerer en grense som er off-screen
UICollisionBehavior * collisionBehavior = [ ,,,0],[UICollisionBehavior Alloc] initWithItems: @ [self.alertView]] [collisionBehavior addBoundaryWithIdentifier: @ "alertCollisionBoundary" fromPoint: CGPointMake (self.initialAlertViewFrame.origin.x, self.initialAlertViewFrame.origin.y - 10,0) toPoint: CGPointMake (selv. initialAlertViewFrame.origin.x + self.initialAlertViewFrame.size.width, self.initialAlertViewFrame.origin.y - 10,0)] [self.animator addBehavior: collisionBehavior];
Vi trenger også et dynamisk element oppførsel for innstilling av elastisitet kollisjonen. Resultatet er at en våken visningen vil sprette litt når det kolliderer med off-screen grensen
UIDynamicItemBehavior * itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems: @ [self.alertView]];. ItemBehavior.elasticity = 0,4; [ ,,,0],self.animator addBehavior: itemBehavior];
Vi trenger også å gjøre bakgrunnen visningen gjennomsiktig igjen. Vi gjør dette ved å sette bakgrunnen utsikt alpha eiendom til 0,0 i en animasjon blokk
[UIView animateWithDuration: 2,0 animasjoner: ^ {[self.backgroundView setAlpha: 0,0];}];.
Kjør programmet en gang til se resultatet.
6. Håndtering brukermedvirkning
Selv om varsling visning reagerer på brukermedvirkning som vi ikke vet hvilken knapp brukeren har avlyttet. Det er det vi vil fokusere på i denne delen.
Som vi gjorde med menykomponenten, vi kommer til å gjøre bruk av blokker for å løse dette problemet. Blokker gjøre for en elegant løsning, og kan ofte være lettere å bruke enn en delegat protokoll.
Vi starter ved å oppdatere den offentlige showAlertView metoden. Metoden må akseptere en gjennomføring handler om at varsling visningen påkaller når brukeren har tappet en av knappene. I AlertComponent.h
, oppdatere erklæringen av showAlertView metoden fra: Anmeldelser - (void) showAlertView;
til: Anmeldelser - (void) showAlertViewWithSelectionHandler: (void (^) (NSInteger buttonIndex, NSString * buttonTitle)) handler;
Gjennomføringen handler aksepterer to parametre, indeksen, av type NSInteger, og tittelen, av type NSString, av den knappen som ble tappet av brukeren. Hvis vi ønsker å påberope seg ferdigstillelse behandleren når brukeren kraner en knapp av varselet syn, må vi holde en referanse til ferdigstillelse behandleren. Dette betyr at vi trenger å erklære en eiendom for ferdigstillelse behandleren. Vi gjør dette i privat klasse forlengelse i AlertComponent.m
.
interface AlertComponent () ... @ eiendom (nonatomic, sterk) void (^ selectionHandler) (NSInteger, NSString *);. .. @ slutten
Fortsatt i AlertComponent.m
, oppdatere metodebeskrivelse som vi gjorde i topptekstfilen et øyeblikk siden og lagre ferdigstillelse handler i selectionHandler eiendommen, som bare vi deklarert.
- (void) showAlertViewWithSelectionHandler: (void (^) (NSInteger, NSString *)) handler {self.selectionHandler = handler; ...}
Den siste brikken i puslespillet er å påberope seg ferdigstillelse handler i handleButtonTap :, passerer i knappens tag og tittel Anmeldelser - (void) handleButtonTap:. (UIButton *) avsender {//Ring valget behandleren. self.selectionHandler (sender.tag, sender.titleLabel.text); ...}
AlertComponent er fullført. Det er på tide å teste alt. Head tilbake til ViewController.m Hotell og oppdatere showAlertView: action som vist nedenfor. Som du kan se, påberope vi den nye showAlertViewWithSelectionHandler. Metode og passerer i en blokk, som vil bli kalt når en knapp i varsel visningen tappes av brukeren Anmeldelser - (IBAction) showAlertView: (id) avsender {[ ,,,0],self.alertComponent showAlertViewWithSelectionHandler: ^ (NSInteger buttonIndex, NSString * buttonTitle) {NSLog (@ "% ld,% @", (lang) buttonIndex, buttonTitle); }];}
Det var det. Kjør søknaden din en gang til og inspisere Xcode konsoll for å se resultatet av arbeidet vårt.
Konklusjon
UIKit Dynamics ble først introdusert i iOS 7, og kan hjelpe deg å lage realistiske animasjoner raskt. Denne korte serien har vist at å utnytte UIKit Dynamics i prosjektene er ikke vanskelig, og du trenger ikke å være ekspert i matematikk eller fysikk.
Merk at UIKit Dynamics er primært ment for bruk i Se baserte applikasjoner . Hvis du leter etter en lignende løsning for spill, så jeg anbefaler å ta en titt på Apples Sprite Kit, som er rettet mot spillutvikling.