Video: Uitleg: zo deel je live je locatie met je vrienden via apps 2024
Het is gemakkelijk om een knop toe te voegen aan de werkbalkbalk in uw iOS-app om in te zoomen naar de huidige locatie en vervolgens terug naar de kaartregio en de reeks die u momenteel weergeeft.
Voeg de vetgedrukte code toe om de knop toe te voegen in de MapController-methode viewDidLoad.
- (void) viewDidLoad {[super viewDidLoad]; zelf. kaart overzicht. delegeren = zelf; zelf. kaart overzicht. showsUserLocation = YES; [self setInitialRegion]; RTAppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {UILabel * titleLabel = [[UILabel alloc] initWithFrame: CGRectMake (0, 0, 250, 44)]; titleLabel. textColor = [UIColor yellowColor]; titleLabel. font = [UIFont boldSystemFontOfSize: 17]; titleLabel. textAlignment = NSTextAlignmentCenter; titleLabel. backgroundColor = [UIColor clearColor]; titleLabel. text = [self mapTitle]; UIBarButtonItem * titleView = [[UIBarButtonItem alloc] initWithCustomView: titleLabel]; UIBarButtonItem * flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target: nil action: nil]; flexibleSpace. breedte = 1,0; NSMutableArray * itemsArray = [self. werkbalk. items mutableCopy]; [itemsArray insertObject: flexibleSpace atIndex: [itemsArray count] -2]; [itemsArray insertObject: titleView atIndex: [itemsArray count] -2]; [zelf. werkbalk setItems: itemsArrayanimated: NO];} else {self. title = [appDelegate. trip mapTitle];} [self addAnnotations]; UIBarButtonItem * locateButton = [[UIBarButtonItem alloc] initWithTitle: @ "Locate" style: UIBarButtonItemStyleBordered target: self action: @selector (goToLocation:)];; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { NSMutableArray * itemsArray = [zelf. werkbalk. items mutableCopy]; [itemsArray insertObject: locateButton atIndex: [itemsArray-aantal]]; [zelf. werkbalk setItems: itemsArray geanimeerd: NO]; } anders { zelf. navigationItem. rightBarButtonItem = locateButton; } }
Wanneer de gebruiker op de knop Locate tikt die u hier hebt gemaakt, heeft u opgegeven dat het goToLocation: bericht moet worden verzonden [action: @selector (goToLocation:)] naar de MapController (doel: zelf).
UIBarButtonItem * locateButton = [[UIBarButtonItem alloc] initWithTitle: @ "Zoek" stijl: UIBarButtonItemStylePlain doel: zelfactie: @selector (goToLocation:)]; zelf. navigationItem. rightBarButtonItem = locateButton;
Vergeet niet dat om terug te gaan naar een locatie, u een gesimuleerde locatie moet kiezen als u de Simulator gebruikt.
Voeg vervolgens de goToLocation: methode toe aan MapController. m.
MKUserLocation * annotation = self. kaart overzicht. userLocation; CLLocation * location = annotation. plaats; als (nul == locatie) terugkeren; CLLocationDistance distance = MAX (4 * locatie. HorizontalAccuracy, 500); MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (locatie, coördinaat, afstand, afstand); [zelf. mapView setRegion: region animated: NO]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. werkbalk. items; UIBarButtonItem * locateButton = [itemsArray-objectAtIndex: [aantal itemsArray] -1]; locateButton. actie = @selector (goToDestination:); locateButton. title = @ "Bestemming";} else {self. navigationItem. rightBarButtonItem. actie = @selector (goToDestination:); zelf. navigationItem. rightBarButtonItem. title = @ "Bestemming";}}
Wanneer de gebruiker op de knop Locate tikt, controleert uw app eerst of de locatie beschikbaar is. (Het kan enkele seconden duren nadat de toepassing start om de locatie beschikbaar te maken.) Zo niet, dan keert u eenvoudig terug van de methode zonder de regio te wijzigen. (U kunt natuurlijk een waarschuwing weergeven waarin de gebruiker wordt geïnformeerd over wat er gebeurt en om het over 10 seconden opnieuw te proberen)
Als de locatie beschikbaar is, berekent uw app de periode voor de regio waar de gebruiker naartoe verhuist. In dit geval is de volgende code
CLLocationDistance-afstand = MAX (4 * locatie. HorizontalAccuracy, 500);
berekent de reeks om vier keer de horizontalAccuracy van het apparaat te zijn (maar niet minder dan 1, 000 meter). horizontalAccuracy is een straal van onzekerheid gezien de nauwkeurigheid van het apparaat; dat wil zeggen, de gebruiker bevindt zich ergens binnen die cirkel.
Vervolgens roept u de functie MKCoordinateRegionMakeWithDistance aan waarmee een nieuwe MKCoordinateRegion wordt gemaakt op basis van de opgegeven coördinaat- en afstandswaarden.
Als u de reeks niet had willen wijzigen, had u eenvoudigweg de centerCoordinate-eigenschap van de kaartweergave kunnen instellen op userLocation en zou de regio op de userLocation-coördinaat gecentreerd zijn zonder de reeks te wijzigen.
Wanneer de gebruiker op de knop Locatie tikt, wijzigt u de titel op de knop in de titel van de map en wijzigt u de @selector in (goToDestination:). Je opent de knop op de iPad in de werkbalkitemsArray en op de iPhone via het navigationItem.
Dit betekent dat de volgende keer dat de gebruiker de knop aanraakt, het GoToDestination: -bericht wordt verzonden, dus u kunt beter de code toevoegen aan MapController. m. Hiermee wordt de regio teruggezet naar de bestemmingsregio en wordt de knoptitel teruggezet naar Locate.
- (ongeldig) goToDestination: (id) afzender {[self setInitialRegion]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. werkbalk. items; UIBarButtonItem * locateButton = [itemsArray-objectAtIndex: [aantal itemsArray] -1]; locateButton. actie = @selector (goToLocation:); locateButton. title = @ "Lokaliseren";} else {self. navigationItem.rightBarButtonItem. actie = @selector (goToLocation:); zelf. navigationItem. rightBarButtonItem. title = @ "Lokaliseren";}}
Voer nu uw app uit. Omdat je al twee annotaties op de kaart van New York hebt staan, wil je misschien de Simulator instellen om een verre locatie zoals San Francisco te gebruiken. Op die manier kunt u gemakkelijk zien dat de kaart werkt.
Omdat u de gebruikerslocatie hebt, bent u misschien geneigd om die te gebruiken om de kaart te centreren, en dat zou goed werken, zolang u het mechanisme van locatiebepaling start zodra het programma wordt gestart.
Het probleem is dat het enige tijd kan duren voordat de hardware de huidige locatie heeft gevonden en als u niet lang genoeg wacht, krijgt u een foutmelding. U kunt de code toevoegen om de kaart te centreren naar een methode die later wordt uitgevoerd, zoals
- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) objectwijziging: (NSDictionary *) verander context: (ongeldig *) context {
Dit bericht wordt verzonden zodra de kaart locatiegegevens ontvangt, maar u ziet een eerste weergave en vervolgens een weergave van de gecentreerde weergave. Om esthetische redenen moet MapController en MapView bij het opstarten van het programma worden geïnitialiseerd - een oefening voor de lezer.