Перетаскиваемые аннотации 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
.