Domanda

La mia app conosce la posizione dell'utente corrente (CoreLocation.framework). Non appena l'utente apre un nuovo MapView, il suo iPhone ricomincia a cercare la posizione corrente. È possibile ignorarlo o modificare la prima posizione dell'utente per mkMapView?

Modifica:

È possibile sovrascrivere MKMapView e utilizzare un altro LocationManager?

È stato utile?

Soluzione

Sì, è possibile avere un oggetto gestore di posizione separato e assegnare il suo valore alla mapview (A proposito, sto usando '=' di seguito come prefisso elenco per evitare che il formatter del codice SO si blocchi).

= Nel tuo UIViewController mantieni due proprietà separate: una a un MKMapView e una a un CLLocationManager .

= Crea un file XIB con MKMapView e qualsiasi altra finestra cromata che desideri. Collegare le prese alle proprietà del controller. Assicurati che MKMapView NON segua la posizione dell'utente.

= Avere UIViewController implementare il protocollo CLLocationManagerDelegate , in particolare il metodo locationManager: didUpdateToLocation: fromLocation: che verrà chiamato ogni volta che è disponibile un nuovo valore di posizione. Imposteremo il controller come delegato per il gestore della posizione.

= Nel metodo loadView di viewController, caricare il NIB con MKMapView al suo interno. Per fornire feedback agli utenti, potresti voler creare un filatore UIActivityIndicatorView e impostarlo su startAnimating . Quindi inizi con:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];

= In locationManager: didUpdateToLocation: fromLocation: controlla se l'evento è stato aggiornato dagli ultimi N secondi. Quindi dì al gestore della posizione di interrompere l'aggiornamento, lo spinner di interrompere l'animazione e ottenere i dati lat / long e assegnarli alla vista della mappa insieme a un intervallo di visualizzazione e una regione in modo da ingrandire e centrare nel posto giusto.

= Ora ecco la parte complicata: il "throbber" in marmo blu è una caratteristica della posizione dell'utente di tracciamento della visualizzazione della mappa. Dovrai momentaneamente "simularlo" fino a quando non entrerà in gioco quello reale (o semplicemente usare un marcatore separato per la posizione corrente e mantenerlo tu stesso). Personalmente andrei con il marmo blu con cui l'utente ha familiarità.

= Per renderlo visibile all'avvio, dovrai creare un MKAnnotationView personalizzato con solo la grafica in marmo blu aggiunta nella posizione restituita dal gestore della posizione. Ciò significa scattare un'istantanea di una Mapview con la posizione mostrata, quindi scattare foto solo con il marmo blu e usarlo come immagine per una vista annotazione personalizzata.

= Se vuoi che segua attivamente la mappa, puoi abilitare il tracciamento della localizzazione dell'utente della mapview e quando ottiene i dati effettivi, nascondi il marker precedentemente impostato e lascia che la mapview esegua l'aggiornamento. L'altra opzione è quella di consentire al gestore della posizione esistente di continuare a ricevere gli aggiornamenti circa ogni secondo e aggiornare la posizione dell'annotazione di marmo blu da soli.

= Per consentire all'utente stesso la posizione della mapview di effettuare l'aggiornamento aggiungendo a viewDidLoad:

[self.map.userLocation addObserver:self 
forKeyPath:@"location" 
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location

= Implementa observValueForKeyPath . Viene chiamato quando l'attributo location dell'attributo userlocation della mapview ha un valore:

-(void)observeValueForKeyPath:(NSString *)keyPath 
      ofObject:(id)object 
        change:(NSDictionary *)change 
       context:(void *)context 
{
     if ([self.map isUserLocationVisible]) {
         [self.locationManager stopUpdatingLocation];
         self.ownBlueMarble.hidden = YES;
     }
     // The current location is in self.map.userLocation.coordinate
}

= Per evitare il ritardo del riscaldamento nella visualizzazione della posizione corrente, tenere un riferimento al viewController contenente la mappa e il gestore della posizione in modo che non scompaiano (è un po 'un ricordo della memoria ma se lo si rilascia è dovrò aspettare di nuovo fino a quando MapView caricherà le tessere ed è pronto per partire).

= In viewWillLoad puoi inserire l'ultima posizione nota nell'annotazione bluemarble personalizzata e mostrarla. Attiva / disattiva il monitoraggio della localizzazione dell'utente e quando ricevi la notifica funzionerà lo stesso trucco per nascondere l'annotazione-mostrare-il-vero-marmo. Il gestore della posizione della mapview interviene e quando ha i dati, puoi far scomparire il tuo marcatore di annotazione.

= Potresti voler implementare il metodo viewWillDisappear di viewController e disattivare manualmente il tracciamento userLocation sulla mappa, quindi è disattivato per impostazione predefinita alla successiva visualizzazione della vista. Ti consigliamo inoltre di ottenere l'ultimo userLocation noto e salvarlo per il prossimo get-go. In questo modo, puoi eseguire tutto il posizionamento dei marker di giocoleria nel metodo viewWillAppear e non devi preoccuparti che l'utenteLocation interferisca fino a quando non sei pronto.

Buona fortuna.

Altri suggerimenti

Nel controller:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154};
    MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1};
    MKCoordinateRegion region = {coord, span};
    [mapView setRegion:region];
}

Quando appare la mappa sarà centrata vicino a Palo Alto

Prova a impostare la proprietà showUserLocation su false al momento dell'inizializzazione, quindi ripristina la area che la vista mappa aveva precedentemente (dovrai ovviamente memorizzarla prima che la mappa precedente venga distrutta ).

È questo quello che volevi?

Non è necessario utilizzare un altro gestore della posizione, è possibile aggiungere alla mappa tutti i punti desiderati e aggiornarli tramite qualsiasi altra logica desiderata.

Supponiamo che tu abbia una connessione socket a un'auto telecomandata e che l'auto rispedisca i dati socket contenenti le informazioni di geolocalizzazione nel payload. Puoi analizzarlo e aggiornare la posizione della miniatura sulla mappa in tempo reale. La posizione utente " la proprietà non è necessaria per questo, ma puoi mostrarla se lo desideri.

La posizione dell'utente è di sola lettura, puoi usarla o meno. Ciò non significa che hai bisogno di un altro gestore della posizione per fare tutto ciò che potresti dover fare. Sembra che la tua app non abbia davvero bisogno di quella funzionalità, ma potrei fraintendere la tua domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top