2009-07-27 13 views
9

Eine benutzerdefinierte AnnotationView wird mit neuen Koordinaten aktualisiert. Das Problem besteht jedoch darin, dass es erst nach einigen Manipulationen mit MKMapView, z. Zoomen oder Verschieben. Was muss ich tun, um die visuelle Position auf einer Karte manuell zu aktualisieren?MKMapView Refresh nach Stiftbewegungen

PS. Ich habe versucht, die Region in die aktuelle Kartenregion zu ändern. Aber es ändert sich Zoom. Es ist komisch.

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

Bitte sehen Sie meine Antwort unter dem folgenden Link: http://StackOverflow.com/A/24564868/665961 –

Antwort

19

Ich bin ein wenig nach Stunden der Forschung shocked. Die Antwort ist nur:

Fragen Sie mich nicht warum, aber es aktualisiert eine Mapview und es ist, was ich brauchte. Hier

+1

UPD: Es hilft nicht mit SDK 3.1. Noch in der Forschung. – slatvick

+1

Funktioniert auch nicht in 3.1.2. – bradheintz

+0

Das hat meinen Fehler behoben! Vielen Dank!!!!! –

-7

ist die Schnittstelle zu 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  

Und hier ist die Umsetzung:

// 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 stellt die Eigenschaft von Anmerkungen über KVO koordinieren. Sie müssen lediglich das korrekte KVO Protokoll beachten und die Anmerkungen willChangeValueForKey: und didChangeValueForKey: mit dem Schlüsselpfad vor und nach dem Aktualisieren der Koordinaten senden.

Ebenso werden title und subtitle auch von MKMapView beobachtet. also, wenn Sie diese und wollen den Wert in der callout aktualisieren automatisch auf Ihrer Seite ohne jede Anstrengung zu ändern, gehen Sie einfach das gleiche: rufen willChangeValueForKey: und didChangeValueForKey:

+0

Das ist wirklich gut zu wissen, danke. – samvermette

+0

Während 'setCenterCoordinate: animated:' funktioniert, funktioniert der KVO-Weg auch hier und ist definitiv besser geeignet und erlaubt dem 'MKMapView', Updates aus mehreren Beobachtungen besser zu koordinieren. –

-2

Es gibt keinen Grund, warum Sie nicht entfernen und dann erneut hinzufügen die Anmerkung . Das ist wahrscheinlich viel performanter, als die gesamte Karte zu verschieben, auch wenn es sich um eine falsche Bewegung handelt.

+0

Jemand möchte erklären, warum dies abgelehnt wurde? Dies ist zumindest eine Alternative, und ich würde argumentieren, dass es leistungsfähiger ist. –

+0

Ich bin mir sicher, dass die meisten Leute, die diesen Thread gefunden haben, dies bereits versucht haben; Ich weiß, dass ich es getan habe. Dies verursacht bizarres Verhalten. –

2

Die Antwort hier ist NICHT das MapView oder die Annotation zu aktualisieren!

die Koordinateneigenschaft von MKAnnotation hat KVO darauf. Wenn Sie einfach den ID-Zeiger des gewünschten Objekts in der Map hinzufügen und die Koordinateneigenschaft mit einem neuen Speicherort aktualisieren, erledigt MKMapView den Rest für Sie.

So nah wie möglich zu einem kostenlosen Mittagessen!

9

Wenn Sie Ihre Annotationen aus einem Thread hinzufügen, wird es nicht funktionieren. Ich hatte das gleiche Problem und nur meine Funktion Verpackung, die die Anmerkungen mit dem folgenden Zugabe wurde gearbeitet

[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

ich diesen Fehler mit einem asynchronen Aufruf gelöst, mindestens 0,5 Verzögerung.

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

Wo "redrawPins" die Funktion, die Stifte fügt ist und entfernt.