Перетаскиваемые аннотации iOS MapKit (MKAnnotationView) больше не панорамируются с картой

Я учусь использовать MapKit в своем новом iOS-приложении. Я использую некоторые из моих модельных объектов в качестве аннотаций (добавил<MKAnnotation> протокол к их заголовку файла). Я также создаю пользовательские MKAnnotationViews и устанавливаюdraggable собственность наYES.

Моя модель объекта имеетlocation свойство, которое являетсяCLLocation*, Чтобы соответствовать<MKAnnotation> Протокол, я добавил следующее к этому объекту:

- (CLLocationCoordinate2D) coordinate {
    return self.location.coordinate;
}

- (void) setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    CLLocation* newLocation = [[CLLocation alloc]
        initWithCoordinate: newCoordinate
        altitude: self.location.altitude
        horizontalAccuracy: self.location.horizontalAccuracy
        verticalAccuracy: self.location.verticalAccuracy
        timestamp: nil];
    self.location = newLocation;
}

- (NSString*) title {
    return self.name;
}

- (NSString*) subtitle {
    return self.serialID;
}

Итак, у меня есть 4 обязательных метода. И они довольно просты. Когда я читаю документы Apple наMKAnnotationView и@draggable собственности, он говорит следующее:

Установка этого свойства в YES делает аннотацию перетаскиваемой пользователем. Если ДА, связанный объект аннотации также должен реализовывать метод setCoordinate :. Значение по умолчанию этого свойства - НЕТ.

И в других местахMKAnnotation документы говорят:

Ваша реализация этого свойства должна соответствовать наблюдению значения ключа (KVO). Для получения дополнительной информации о том, как реализовать поддержку KVO, см. Руководство по программированию наблюдения значения ключа.

Я прочитал этот (краткий) документ, и мне совершенно не ясно, что я должен сделать для этого, чтобыcoordinate, который я извлекаю из моегоlocation собственность является собственностью сама по себе.

Но я уверен, что он работает неправильно. Когда я перетаскиваю булавку, она перемещается, но при перемещении карты она больше не перемещается.

ОБНОВИТЬ

Поэтому я попробовал поиграть со стоковой MKPinAnnotationView. Для этого я просто закомментировал свой делегатmapView:viewForAnnotation: метод. Я обнаружил, что по умолчанию они не перетаскиваются. Я добавилmapView:didAddAnnotationViews: моему делегату, чтобы установитьdraggable свойство добавленных просмотров вYES.

После настройки таким образом представления Pin, как намекает Джон Эстропия ниже, кажутся работающими нормально. Я решил использоватьmapView:annotationView:didChangeDragState:fromOldState: Хук делегата, чтобы ближе познакомиться с тем, что происходит:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {
    NSArray* states = @[@"None", @"Starting", @"Dragging", @"Cancelling", @"Ending"];
    NSLog(@"dragStateChangeFrom: %@ to: %@", states[oldState], states[newState]);
}

Для биржевых штифтов вы увидите вывод журнала, который выглядит следующим образом:

2014-02-05 09:07:45.924 myValve[1781:60b] dragStateChangeFrom: None to: Starting
2014-02-05 09:07:46.249 myValve[1781:60b] dragStateChangeFrom: Starting to: Dragging
2014-02-05 09:07:47.601 myValve[1781:60b] dragStateChangeFrom: Dragging to: Ending
2014-02-05 09:07:48.006 myValve[1781:60b] dragStateChangeFrom: Ending to: None

Что выглядит довольно логично. Но если вы переключитесь на настроенныйMKAnnotationView, результат, который вы увидите, выглядит так:

2014-02-05 09:09:41.389 myValve[1791:60b] dragStateChangeFrom: None to: Starting
2014-02-05 09:09:45.451 myValve[1791:60b] dragStateChangeFrom: Starting to: Ending

Он пропускает ДВА перехода, от начала до перетаскивания, и от окончания до None.

Поэтому я начинаю скептически относиться к тому, что мне нужно сделать что-то другое со свойствами. Но я все еще разочарован тем, почему это не сработает.

ОБНОВЛЕНИЕ 2

Я создал свой собственныйAnnotation объект стоять между объектами моей модели, которые могут иметь свойствоcoordinate свойство. Поведение остается прежним. Кажется, что-то сMKAnnotationView.

Ответы на вопрос(4)

Ваш ответ на вопрос