2009-07-27 13 views
9

Niestandardowy AnnotationView jest aktualizowany o nowe współrzędne. Problem polega jednak na tym, że wizualnie aktualizuje się tylko po pewnych manipulacjach z MKMapView, np. powiększanie lub przesuwanie. Co należy zrobić, aby ręcznie zaktualizować pozycję wizualną na mapie?Odświeżanie MKMapView po przesunięciu pinezki

PS. Próbowałem zmienić region na obecny obszar mapy. Ale zmienia zoom. To dziwne.

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

Proszę zobaczyć moją odpowiedź pod następującym linkiem: http://stackoverflow.com/a/24564868/665961 –

Odpowiedz

19

Jestem trochę shoked po godzinach badań. Odpowiedź brzmi:

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

Nie pytaj mnie dlaczego, ale aktualizuje widok mapy i to jest to, czego potrzebowałem.

+1

UPD: to nie pomaga z SDK 3.1. Wciąż w badaniach. – slatvick

+1

Nie działa również w wersji 3.1.2. – bradheintz

+0

Naprawiłem błąd! Dzięki!!!!! –

-7

Oto interfejs 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  

I tu jest wdrożenie:

// 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 zauważa własność adnotacji współrzędnych poprzez KVO. Należy po prostu przestrzegać odpowiedniego protokołu KVO i przesłać adnotację willChangeValueForKey: i didChangeValueForKey: za pomocą klawisza @"coordinate" przed zaktualizowaniem współrzędnych.

Podobnie title i subtitle są również obserwowane przez MKMapView. więc jeśli aktualizuje te i chcą wartość w objaśnieniu zmieniać automatycznie, bez żadnego wysiłku z Twojej strony, po prostu zrobić to samo: zadzwoń willChangeValueForKey: i didChangeValueForKey:

+0

To naprawdę dobrze wiedzieć, dzięki. – samvermette

+0

Podczas gdy "setCenterCoordinate: animated:" działa, sposób KVO również działa i jest zdecydowanie bardziej odpowiedni i pozwala "MKMapView" lepiej koordynować aktualizacje z wielu obserwacji. –

-2

Nie ma powodu, nie można usunąć i ponownie dodać adnotację . Prawdopodobnie jest to o wiele bardziej wydajne niż przenoszenie całej mapy, nawet jeśli jest to fałszywe posunięcie.

+0

Ktoś chce wyjaśnić, dlaczego zostało to odrzucone? Jest to co najmniej alternatywa i twierdzę, że jest bardziej wydajna. –

+0

Jestem pewien, że większość osób, które znalazły ten wątek, już próbowało tego; Wiem, że to zrobiłem. To powoduje dziwaczne zachowanie. –

2

Odpowiedź tutaj NIE polega na odświeżaniu MapView ani Adnotacji!

Właściwość współrzędnych MKAnnotation ma na niej KVO. Jeśli po prostu dodasz wskaźnik ID, obiektu, który chcesz na mapie, do widoku mapy i zaktualizujesz właściwość współrzędnych o nową lokalizację, zrobi resztę za Ciebie.

Tak blisko, jak można dostać się na darmowy lunch!

9

jeśli dodasz swoje annozacje z wątku, to nie zadziała. miałem ten sam problem i po prostu owijania moją funkcję, która została dodanie adnotacji z poniższych pracowali

[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

I rozwiązać ten błąd z asynchronicznego połączenia co najmniej 0,5 opóźnienie.

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

gdzie "redrawPins" oznacza funkcję, która dodaje i usuwa szpilki.

Powiązane problemy