2009-07-27 10 views
9

Un AnnotationView personalizzato viene aggiornato con nuove coordinate. Ma il problema è che esso si aggiorna visivamente solo dopo alcune manipolazioni con MKMapView, ad es. zoom o movimento. Cosa devo fare per aggiornare manualmente la posizione visiva su una mappa?MKMapView aggiornamento dopo spostamenti pin

PS. Ho provato a cambiare regione nella regione attuale della mappa. Ma cambia zoom. È strano.

[mapView setRegion:[mapView region] animated:YES]; 
+0

Si prega di vedere la mia risposta al seguente link: http://stackoverflow.com/a/24564868/665961 –

risposta

19

Sono un po 'scosso dopo ore di ricerca. La risposta è giusta:

[mapView setCenterCoordinate:mapView.region.center animated:NO]; 

Non chiedermi il motivo, ma aggiorna una vista mappa ed è quello di cui avevo bisogno.

+1

UPD: non aiuta con SDK 3.1. Ancora in ricerca – slatvick

+1

Non funziona neanche in 3.1.2. – bradheintz

+0

Questo ha corretto il mio errore! Grazie!!!!! –

-7

Qui è l'interfaccia a MapAnnotation:

// CSMapAnnotation.h 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h>  

// types of annotations for which we will provide annotation views. 
typedef enum { 
    MapAnnotationTypeStart = 0, 
    MapAnnotationTypeEnd = 1, 
    MapAnnotationTypeImage = 2 
} MapAnnotationType; 

@interface MapAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D _coordinate; 
    MapAnnotationType  _annotationType; 
    NSString*    _title; 
    NSString*    _subtitle; 
    NSString*    _userData; 
    NSString*    speed; 
    NSString*    identifier; 
} 

@property (nonatomic, retain) NSString *speed; 
@property (nonatomic, retain) NSString *identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speed 
    identifier: (NSString *) identifier;  
-(id) setWithCoordinate: (CLLocationCoordinate2D) coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speed 
    identifier: (NSString*) identifier;  
@property MapAnnotationType annotationType; 
@property (nonatomic, retain) NSString* userData;  
@end  

E qui è l'implementazione:

// CSMapAnnotation.m 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import "MapAnnotation.h"  

@implementation MapAnnotation 

@synthesize coordinate  = _coordinate; 
@synthesize annotationType = _annotationType; 
@synthesize userData  = _userData; 
@synthesize speed; 
@synthesize identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*)title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speedz 
    identifier: (NSString *) identifierz 
{ 
    self = [super init]; 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz; 
    return self; 
}  
-(id) setWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speedz 
    identifier: (NSString*) identifierz 
{ 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz;  
    return self; 
}  
-(NSString*) title 
{ 
    return _title; 
}  
-(NSString*) subtitle 
{ 
    return _subtitle; 
}  
-(void) dealloc 
{ 
    [_title release]; 
    [_userData release]; 
    [super dealloc]; 
}  
@end 
12

MKMapView osserva la proprietà delle annotazioni coordinate via KVO. È sufficiente osservare il protocollo KVO corretto e inviare l'annotazione willChangeValueForKey: e didChangeValueForKey: con il keypath di @"coordinate" prima e dopo aver aggiornato le coordinate.

Allo stesso modo title e subtitle sono inoltre osservati da MKMapView. quindi se si aggiorna quelli e desidera che il valore nella didascalia per cambiare automaticamente senza alcuno sforzo da parte vostra, basta fare lo stesso: lo chiamano willChangeValueForKey: e didChangeValueForKey:

+0

Questo è davvero buono a sapersi, grazie. – samvermette

+0

Mentre "setCenterCoordinate: animated:" funziona, il modo KVO qui funziona anche ed è decisamente più appropriato e consente a 'MKMapView' di coordinare meglio gli aggiornamenti da più osservazioni. –

-2

Non c'è ragione per cui non è possibile rimuovere e quindi aggiungere nuovamente l'annotazione . Probabilmente è molto più performante che spostare l'intera mappa, anche se è una mossa falsa.

+0

Qualcuno vuole spiegare perché questo è stato downvoted? Questa è almeno un'alternativa e direi che è più performante. –

+0

Sono sicuro che molte persone che hanno trovato questo thread lo abbiano già provato; So che l'ho fatto. Ciò provoca un comportamento bizzarro. –

2

La risposta qui NON è aggiornare il MapView o l'annotazione!

la proprietà di coordinate di MKAnnotation contiene KVO. Se si aggiunge il puntatore ID, dell'oggetto che si desidera sulla mappa, a mapview e si aggiorna la proprietà delle coordinate con una nuova posizione, MKMapView farà il resto per te.

Il più vicino possibile ad un pranzo gratis!

9

se si aggiungono i tuoi commenti da un thread non funzionerà. Ho avuto lo stesso problema e solo confezionamento mia funzione che è stata aggiunta le annotazioni con la seguente lavorato

[self performSelectorOnMainThread:@selector(addCameraIconOnMain:) obj waitUntilDone:true]; 

-(void) addCameraIconOnMain:(myobjecttype*)obj 
{ 
    // this isnt the entire function, customize for your own purpose..... 
    [mapView addAnnotation:annotation]; 
} 
0

Ho risolto questo errore con una chiamata asincrona, almeno 0,5 ritardo.

es .: [self performSelector:@selector(redrawPins) withObject:nil afterDelay:0.5];

Dove "redrawPins" è la funzione che aggiunge e rimuove sulla mappa.

Problemi correlati