Video: Driver app announcement with Uber CEO | April 10, 2018 | Uber 2025
Det ville være rart at kunne trække en bil og placere den overalt på skærmen i din iOS-app. Her finder du ud af, hvordan man kode for at trække et objekt, samt hvordan man arbejder på en iOS-enhed.
Ved at trykke på en finger (eller løfte den fra skærmen) tilføjes en berøringshændelse til programmets begivenhedskø, hvor den er indkapslet (indeholdt) i et UIEvent-objekt. Der findes en UITouch-objekt for hver finger, der berører skærmen, som gør det muligt at spore individuelle berøringer.
TouchenBegan: withEvent: Meddelelsen sendes, når en eller flere fingre rører ned i en visning. Denne meddelelse er en metode til TestDriveController's superklasse, UIResponder, hvorfra reguleringsenheden er afledt.
Når brugeren fortsætter med at berøre skærmen med sine fingre, rapporterer systemet ændringerne for hver finger i det tilsvarende UITouch-objekt, hvorved man sender touchesMoved:withEvent: message. TouchEnded: withEvent: Meddelelsen sendes, når en eller flere fingre løftes fra den tilknyttede visning. RøreneCancelled: withEvent: Besked, derimod, sendes, når en systemhændelse (som f.eks. En advarsel om hukommelse) annullerer en berøringshændelse.
I denne app behøver du kun være bekymret over de to første metoder, der netop er beskrevet.
For at starte processen med at reagere på en berøringshændelse skal du tilføje en ny instansvariabel (fed) til TestDriveController. m implementeringsfil.
@interface TestDriveController () {AVAudioPlayer * backgroundAudioPlayer; SystemSoundID burnRubberSoundID; BOOL touchInCar; } -d
Tilføj derefter touchesBegan: -metoden til TestDriveController. m for at starte sporing berører. (Du overstyrer faktisk denne metode, fordi UIViewController arvede den fra UIResponder-basen.)
- (void) berørerBegan: (NSSet *) berører medEvent: (UIEvent *) hændelse {UITouch * touch = [berører anyObject]; hvis (CGRectContainsPoint (selvbil. frame, [touch locationInView: self. view])) touchInCar = YES; ellers {touchInCar = NO; [super touchesBegan: touchesEvent: event];}}
Som tidligere nævnt sendes touchesBegan: withEvent: besked når en eller flere fingre rører ned i en visning. Rørene selv overføres til metoden i en NSSet-objekt - en uordnet samling af forskellige elementer.
For at få adgang til et objekt i NSSet skal du bruge anyObject-metoden - den returnerer et af objekterne i sættet. Til vores formål her antager du kun ét objekt - men du vil måske gerne udforske dette problem yderligere alene, så du kan forstå, hvordan du kan håndtere yderligere muligheder.
Følgende kode viser, hvordan du konfigurerer anyObject-metoden:
UITouch * touch = [berører anyObject];
Derefter skal koden afgøre, om brugerens berøringsbegivenhed er i bilens (UIImage) visning:
hvis (CGRectContainsPoint (selv.bil. ramme, [touch locationInView: self. visning]))
CGRectContainsPoint er en funktion, der returnerer JA, når et rektangel (se koordinater) indeholder et punkt. Du angiver bilens ramme som rektangel:
selv. bil. frame
, og du angiver punktet ved at sende positionInView: meddelelse til berøring:
locationInView: self. visning
locationInView: Returnerer modtagerens aktuelle placering i koordinatsystemet i det givne billede. I dette tilfælde bruger du hovedvisningen, men du vil måske ændre visningen, hvis du f.eks. Forsøger at bestemme placeringen i en anden visning. Måske rører brugeren en itty-bitty gaspedal.
Hvis det er fastslået, at kontakten er i bilen, tildeler du JA til touchInCar-instansvariablen; Hvis det ikke er tilfældet, tildeler du NEJ og videresender meddelelsen op over responderkæden. Du bruger touchInCar senere til at bestemme om brugeren trækker bilen rundt eller bare kører fingeren over skærmen.
Standard implementering af berøringerBegan: gør ingenting. Men underklasser afledt direkte fra UIResponder, især UIView, videresender meddelelsen op over responderkæden. For at videresende beskeden til næste responder, send beskeden til super (superklassimplementeringen).
Hvis du tilsidesætter berøringerBegan: withEvent: uden at kalde super (et almindeligt brugsmønster), skal du også tilsidesætte de andre metoder til håndtering af berøringshændelser, hvis det kun er som stub (tomme) implementeringer.
Flere tryk er deaktiveret som standard. For at gøre det muligt for din app at modtage flere berøringshændelser, skal du angive egenskaben multipleTouchEnabled for den tilsvarende visningseksempel til JA.
Når brugerne flytter bilen skarpt rundt på skærmen (måske siger zoom zoom til sig selv), bliver din app hele tiden sendt til touchesMoved: message. Tilføj koden i Listing 10-13 til TestDriveController. m at tilsidesætte denne metode, som gør det muligt for dig at flytte bilen til hvor brugerens finger er.
- (void) touchesMoved: (NSSet *) berører medEvent: (UIEvent *) hændelse {if (touchInCar) {UITouch * touch = [berører anyObject]; selv. bil. center = [touch locationInView: self. visning];} ellers [super touchesMoved: touchesEvent: event];}
Hvis det første tryk var i bilvisningen (touchInCar er YES), tildeler du bilens centeregenskab til berøringskoordinatet. Når du tildeler en ny værdi til centeregenskaben, ændres visningen øjeblikkeligt. Ellers ignorerer du kontakten og videresender meddelelsen op over responderkæden.
Det er interessant at bemærke, at når du placerer bilen ved siden af en knap, vil den køre under den knap, når du trykker på testdrev knappen. Denne funktion illustrerer understrukturen.
Forsøg at flytte bilen rundt og derefter bruge Test Drive-knappen. Hvis der er noget galt med dine formler til placering af bilen under testdrevet, vil du se det, når bilen starter fra et andet sted.