Video: Impostare e condividere posizioni false con WhatsApp, Facebook (e Pokemon Go) 2024
È facile aggiungere un pulsante alla barra della barra degli strumenti nella app iOS per ingrandire la posizione corrente e quindi tornare alla regione della mappa e all'intervallo che stai attualmente visualizzando.
Aggiungi il codice in grassetto per aggiungere il pulsante nel metodo MapController viewDidLoad.
- (void) viewDidLoad {[super viewDidLoad]; se stesso. MapView. delegato = auto; se stesso. MapView. 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. larghezza = 1. 0; NSMutableArray * itemsArray = [self. barra degli strumenti. elementi mutableCopy]; [itemsArray insertObject: flexibleSpace atIndex: [itemsArray count] -2]; [itemsArray insertObject: titleView atIndex: [itemsArray count] -2]; [se stesso. toolbar setItems: itemsArray animated: 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 = [self. barra degli strumenti. elementi mutableCopy]; [itemsArray insertObject: locateButton atIndex: [itemsArray count]]; [auto. toolbar setItems: itemsArray animated: NO]; } altro { sé. navigationItem. rightBarButtonItem = locateButton; } }
Quando l'utente tocca il pulsante Trova che hai creato qui, hai specificato che il messaggio goToLocation: deve essere inviato [action: @selector (goToLocation:)] al MapController (target: se stesso).
UIBarButtonItem * locateButton = [[UIBarButtonItem alloc]] initWithTitle: @ Stile "Locate": UIBarButtonItemStylePlain target: self action: @selector (goToLocation:)]; se stesso. navigationItem. rightBarButtonItem = locateButton;
Non dimenticare, per tornare a una posizione è necessario scegliere una posizione simulata se si sta utilizzando il simulatore.
Quindi, aggiungere il metodo goToLocation: a MapController. m.
MKUserLocation * annotation = self. MapView. userLocation; CLLocation * location = annotation. Posizione; se (nil == posizione) ritorno; CLLocationDistance distance = MAX (4 * location. HorizontalAccuracy, 500); MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (posizione, coordinate, distanza, distanza); [se stesso. mapView setRegion: region animated: NO]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. barra degli strumenti. elementi; UIBarButtonItem * locateButton = [itemsArray objectAtIndex: [itemsArray count] -1]; locateButton. action = @selector (goToDestination:); locateButton. title = @ "Destination";} else {self. navigationItem. rightBarButtonItem. action = @selector (goToDestination:); se stesso. navigationItem. rightBarButtonItem. title = @ "Destination";}}
Quando l'utente tocca il pulsante Locate, l'app prima controlla se la posizione è disponibile. (Potrebbero essere necessari alcuni secondi dopo l'avvio dell'applicazione per rendere disponibile la posizione.) In caso contrario, è sufficiente tornare dal metodo senza modificare la regione. (Potresti, ovviamente, mostrare un avviso che informa l'utente di ciò che sta accadendo e riprovare tra 10 secondi circa)
Se la posizione è disponibile, la tua app calcola lo span per la regione in cui si trova l'utente. In questo caso, il seguente codice
Distanza distanzaLocale = MAX (posizione 4 * orizzontaleAccuratezza, 500);
calcola lo span per essere quattro volte l'accuratezza orizzontale del dispositivo (ma non meno di 1 000 metri). horizontalAccuracy è un raggio di incertezza data l'accuratezza del dispositivo; cioè, l'utente è da qualche parte all'interno di quella cerchia.
Quindi si chiama la funzione MKCoordinateRegionMakeWithDistance che crea una nuova MKCoordinateRegion dai valori di coordinate e distanza specificati.
Se non si desidera modificare l'intervallo, è possibile semplicemente impostare la proprietà centerCoordinate della vista Mappa su userLocation e ciò avrebbe centrato la regione nella coordinata UserLocation senza modificare lo span.
Quando l'utente tocca il pulsante Posizione, si modifica il titolo sul pulsante sul titolo della mappa e si modifica @selector in (goToDestination:). Si accede al pulsante sull'iPad nella barra degli strumenti itemsArray e su iPhone tramite navigationItem.
Ciò significa che la prossima volta che l'utente tocca il pulsante, verrà inviato il messaggio goToDestination, quindi è meglio aggiungere il codice a MapController. m. Questo imposta la regione nella regione di destinazione e riporta il titolo del pulsante a Locate.
- (void) goToDestination: (id) sender {[self setInitialRegion]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. barra degli strumenti. elementi; UIBarButtonItem * locateButton = [itemsArray objectAtIndex: [itemsArray count] -1]; locateButton. action = @selector (goToLocation:); locateButton. title = @ "Locate";} else {self. navigationItem.rightBarButtonItem. action = @selector (goToLocation:); se stesso. navigationItem. rightBarButtonItem. title = @ "Locate";}}
Ora esegui la tua app. Poiché hai già due annotazioni sulla mappa di New York, potresti voler impostare il simulatore per utilizzare una posizione distante come San Francisco. In questo modo, puoi facilmente vedere che la mappa funziona.
Dato che hai la posizione dell'utente, potresti essere tentato di usarlo per centrare la mappa, e ciò funzionerebbe bene, a patto che inizi il meccanismo di localizzazione non appena il programma verrà lanciato.
Il problema è che l'hardware potrebbe impiegare un po 'di tempo per trovare la posizione corrente e, se non si attende abbastanza a lungo, si ottiene un errore. È possibile aggiungere il codice per centrare la mappa su un metodo che viene eseguito successivamente, come
- (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) oggetto change: (NSDictionary *) cambia contesto: (void *) context {
Questo messaggio viene inviato non appena la mappa inizia a ricevere le informazioni sulla posizione, ma vedrai una vista iniziale e quindi una rivisualizzazione della vista centrata. Per ragioni estetiche, è necessario inizializzare MapController e MapView all'avvio del programma: un esercizio per il lettore.