2010-11-06 11 views
10

Mam zestaw danych z adnotacjami, które można bardzo szybko zaktualizować. W tej chwili usuwam wszystkie adnotacje przed ich ponownym umieszczeniem na mapie.Automatyczne przenoszenie adnotacji MKMapView - animuj je?

NSArray *existingpoints = [mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]; 
[mapView removeAnnotations:existingpoints]; 

obliczyć, gdzie są one w każdym razie w obrębie obiektu niestandardowego, chciałby, aby móc nazwać i „Move” adnotacją bez demontażu i ponownym dodaniu go z powrotem do mapy. Przykładowy wywołanie, które zadziałało i chciałbym prawie "odpytać" jest poniżej.

- (CLLocationCoordinate2D) coordinate 
{ 
    CLLocationCoordinate2D coord; 
    coord.latitude = [lat doubleValue]; 
    coord.longitude = [lon doubleValue]; 


     double differencetime = exampleTime; 
     double speedmoving; 
     double distanceTravelled = speedmoving * differencetime; 

     CLLocationDistance movedDistance = distanceTravelled; 
     double radiansHeaded = DEG2RAD([self.heading doubleValue]); 
     CLLocation *newLocation = [passedLocation newLoc:movedDistance along:radiansHeaded]; 
     coord = newLocation.coordinate; 

    return coord; 
} 

Zgodnie z wnioskiem, plik .h obiektu, nie mam metodę SetCoordinate ..

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

@interface TestObject : NSObject <MKAnnotation>{ 
    NSString *adshex; 
    NSString *lat; 
    NSString *lon; 


    NSString *title; 
    NSString *subtitle; 


    CLLocationCoordinate2D coordinate; 
} 
@property(nonatomic,retain)NSString *adshex; 
@property(nonatomic,retain)NSString *lat; 
@property(nonatomic,retain)NSString *lon; 


@property(nonatomic,retain)NSString *title; 
@property(nonatomic,retain)NSString *subtitle; 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 


- (CLLocationCoordinate2D) coordinate; 

@end 
+0

Czy masz metodę setCoordinate w obiekcie adnotacji lub po prostu metodę współrzędnych? Pokaż plik .h dla obiektu adnotacji. – Anna

+0

Nie, nie, dodałem .h do edycji –

Odpowiedz

20

przypadku aktualizacji adnotacji układzie współrzędnych przy użyciu metody setCoordinate (lub odpowiednik), przy czym widok mapy automatycznie zaktualizuje pozycję adnotacji w widoku. This page w docs mówi co następuje:

Ważne: Podczas wdrożenia koordynować nieruchomość w swojej klasie, to zaleca się jej utworzenie syntetyzować. Jeśli zdecydujesz się na wdrożenie metody dla tego obiektu siebie, lub jeśli ręcznie modyfikować zmiennej bazowej tę właściwość w innych częściach swojej klasie po adnotacji został dodany do mapy, należy wysłać klucz -wartość obserwowanie (KVO) powiadomień, gdy robisz . Zestaw map korzysta z powiadomień KVO do wykrywania zmian współrzędnych, tytułu i właściwości podtytułu dla swoich adnotacji i wprowadzania wszelkich niezbędnych zmian na ekranie mapy. Jeśli wykonasz , nie wysyłając powiadomień KVO, pozycja Twoich adnotacji może nie być prawidłowo aktualizowana na mapie na .

Widok mapy będzie wiedział tylko, aby ponownie przeczytać właściwość współrzędnych adnotacji, jeśli jest powiedziane (za pośrednictwem KVO), że zmieniła się współrzędna. Jednym ze sposobów, aby to zrobić, jest zaimplementowanie metody setCoordinate i wywołanie, gdziekolwiek masz kod, który aktualizuje lokalizację adnotacji.

W kodzie przeliczacie współrzędne w samej tylko właściwości współrzędnej. Co można zrobić, to dodać do pliku adnotacji .m (i na .h):

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate 
{ 
    //do nothing 
} 

aw miejscu gdzie zaktualizować lokalizacje, należy wywołać metodę setCoordinate na adnotacją:

[someAnnotation setCoordinate:someAnnotation.coordinate]; 

Możesz to zrobić w miejscu, w którym obecnie usuwasz/dodajesz adnotacje.

Powyższe wywołanie wygląda zabawnie, ponieważ masz ponownie przeliczoną współrzędną w metodzie współrzędnych-pobierającej. Chociaż powinien działać jako szybka naprawa/test, nie polecam używania go regularnie.

Zamiast tego można ponownie skalować położenie adnotacji na zewnątrz (gdzie obecnie usuwa się/ponownie dodaje adnotacje) i przekazać nową współrzędną do setCoordinate.Twój obiekt adnotacji może przechowywać swoją nową lokalizację w bieżących znakach/lg (ustaw je w zestawie współrzędnych i używaj tylko tych, aby zbudować CLLocationCoordinate2D, aby powrócić z gettera) lub (lepiej) użyj samego współrzędnego ivar (ustaw to w setCoordinate i zwróć go w pobierającym).

+0

Link do "Ważnej" notatki został zmieniony: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps .html # // apple_ref/doc/uid/TP40009497-CH6-SW2 – Anna

+0

Niestety, animacja przejścia w ogóle nie jest animowana. Czy ktoś wie jakikolwiek sposób animować ruchy adnotacji? – devios1

+2

Dowiedz się, jak. Zobacz http://stackoverflow.com/a/8564097/238948 – devios1