Как можно перетаскивать булавку MKPinAnnotationView только одним нажатием?

я добавляю MKPinAnnotationView и setDragAble. мой код здесь

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"];
    [annotationView setDraggable:YES];
    annotationView.pinColor = MKPinAnnotationColorPurple;
    return [annotationView autorelease];
}

хорошо, я могу перетащить булавку.

но одна проблема в том, что это не просто один кран. всегда нужен второй кран.

при первом касании булавка выбирается, но не может перетаскиваться. когда я снова нажимаю, становится доступным перетаскивание.

что случилось? я хочу перетаскивать одним нажатием, как "Map.app"


person seapy    schedule 21.02.2011    source источник


Ответы (4)


Решите эту проблему. ^^

Я думаю, что для перетаскивания булавка уже выбрана.

поэтому выбрал MKPinAnnotationView при его инициализации.

мой новый код.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"];
    [annotationView setDraggable:YES];
    annotationView.pinColor = MKPinAnnotationColorPurple;
    [annotationView setSelected:YES animated:YES];
    return [annotationView autorelease];
}
person seapy    schedule 22.02.2011
comment
Сегодня у меня была точно такая же проблема, и я нашел почти такое же решение, за исключением того, что я вызвал -[mapView selectAnnotation:] в методе mapView:didAddAnnotationViews: делегата. Кажется, работает так же хорошо. - person Daniel Dickison; 22.02.2011
comment
@DanielDickison Да, это сработало для меня. Ответ выше, похоже, не сработал. - person DataGraham; 08.09.2012

Ответы здесь не учитывают, когда вы сначала нажимаете на булавку, а затем отменяете ее выбор, тогда проблема перетаскивания вернется, потому что mapView отменяет выбор представления аннотации. Я наткнулся на новое решение, которое выбирает представление аннотации, которое только что было отменено:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [view setSelected:YES];
}

Это убережет вас от всех разочарований. Прелесть в том, что это все, что вам нужно! Вам вообще не нужно устанавливать контакты как выбранные.

person Armin    schedule 08.08.2013
comment
Идеально! Это, наконец, решает все так, как я ожидаю. Вот версия Swift 3: func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { view.isSelected = true } - person Mike Fischer; 15.12.2016

Обновление: Нет, я ошибаюсь. Мне до сих пор иногда требуется более одного нажатия. Вот мой ошибочный ответ:

Я столкнулся с этой проблемой сегодня. Похоже, это произошло из-за того, что я неправильно изменил состояние перетаскивания, как указано в документации для -setDragState:animated: (не обращайте внимания на документацию для -dragState, она никогда не вызывает setDragState:).

В ответ на эти изменения ваша пользовательская реализация этого метода должна сделать следующее:

Когда состояние перетаскивания изменится на MKAnnotationViewDragStateStarting, установите состояние на MKAnnotationViewDragStateDragging. Если вы выполняете анимацию, чтобы указать начало перетаскивания, а анимированный параметр имеет значение YES, выполните эту анимацию перед изменением состояния. Когда состояние изменится на MKAnnotationViewDragStateCanceling или MKAnnotationViewDragStateEnding, установите состояние на MKAnnotationViewDragStateNone. Если вы выполняете анимацию в конце перетаскивания, а анимированный параметр имеет значение YES, вы должны выполнить эту анимацию перед изменением состояния.

Прежде чем я это сделал, мне почти всегда приходилось дважды нажимать, а затем удерживать. После этого мне еще не приходилось нажимать второй раз.

person Rick    schedule 03.08.2012
comment
нужно ли это просто отредактировать, чтобы ничего не сказать, или удалить полностью? - person lensovet; 15.09.2012

Чтобы перетащить булавку, нужно нажать и удерживать, а не дважды нажать.

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

person Rog    schedule 22.02.2011