MKMapView Перемещение Аннотации автоматически - анимировать их? - PullRequest
11 голосов
/ 06 ноября 2010

У меня есть набор данных аннотаций, которые могут обновляться очень быстро.В настоящий момент я удаляю все аннотации перед тем, как разместить их обратно на карту.

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

Я вычисляю, где они находятся в любом случае в пользовательском объекте, поэтому хотел бы иметь возможность вызвать это и "переместить" аннотацию безудаление и повторное добавление его обратно на карту.Ниже приведен пример вызова, который работает, и я хотел бы почти «опросить».

- (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;
}

В соответствии с запросом, у файла .h объекта, у меня нет метода 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

1 Ответ

21 голосов
/ 06 ноября 2010

Если вы обновите координату аннотации с помощью метода setCoordinate (или его эквивалента), представление карты автоматически обновит положение аннотации в представлении. Эта страница в документах гласит следующее:

Важное замечание: При реализации свойства координаты в вашем классе рекомендуется синтезировать его создание.Если вы решили реализовать методы для этого свойства самостоятельно или если вы вручную изменили переменную, лежащую в основе этого свойства в других частях вашего класса, после добавления аннотации на карту, обязательно отправьте наблюдения значения ключа (KVO)уведомления, когда вы делаете.Map Kit использует уведомления KVO для обнаружения изменений в координатах, заголовке и свойствах субтитров ваших аннотаций и внесении любых необходимых изменений в отображение карты.Если вы не отправляете уведомления KVO, положение ваших аннотаций может не обновляться должным образом на карте.

Представлению карты будет известно только о том, что оно перечитывает свойство координат аннотации, если оносказал (через КВО), что координата изменилась.Один из способов сделать это - реализовать метод setCoordinate и вызывать его везде, где у вас есть код, который обновляет местоположение аннотации.

В своем коде вы пересчитываете координату в самом свойстве только для чтения.Что вы можете сделать, это добавить это в файл аннотации .m (и в .h):

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

и в том месте, где вы обновляете местоположения, вызвать метод setCoordinate для аннотации:

[someAnnotation setCoordinate:someAnnotation.coordinate];

Вы можете сделать это в том месте, где вы в настоящее время удаляете / повторно добавляете аннотации.

Вышеприведенный вызов выглядит забавно, потому что у вас есть пересчет координат в методе координат-получателя.Хотя это должно работать как быстрое исправление / тестирование, я не рекомендую использовать его регулярно.

Вместо этого вы можете пересчитать местоположение аннотации снаружи (где вы в настоящее время удаляете / повторно добавляете аннотации) ипередать новую координату в setCoordinate.Ваш объект аннотации может сохранить свое новое местоположение в имеющихся у вас в настоящее время широтах и ​​долголетах (установите их в setCoordinate и используйте только те, которые создают CLLocationCoordinate2D для возврата из получателя) или (лучше) используйте сам координатный ивар (установите его вsetCoordinate и вернуть его в получатель).

...