Желаемое поведение - иметь возможность касаться в любом месте пузырька выноски и заставлять его выполнять действие кнопки в rightCalloutAccessory.
Это желательно, потому что добавление UIControl к любому calloutAccessory делает весь пузырь выноски доступным для выбора (что означает, что он подсвечивается при нажатии на него, ложно указывая пользователю, что это должно вызвать действие), но не предоставляет реализатору никакого способа обнаружение и реагирование на это нажатие, что приводит к путанице в работе пользователя.
Вот как я решил проблему.
При создании MKAnnotationView добавьте tapGesture в MKAnnotationView
- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id<MKAnnotation>)annotation {
MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotation.reuseID];
aView.canShowCallout = YES;
UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:annotation.callOutImageName]];
aView.leftCalloutAccessoryView = image;
UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[obsDetailButton setImage:[UIImage imageNamed:@"your_image.png"] forState:UIControlStateNormal];
aView.rightCalloutAccessoryView = detailButton;
UITapGestureRecognizer *singleTapOnCallout = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(calloutTapped:)];
[aView addGestureRecognizer:singleTapOnCallout];
}
Затем, в вашем методе обратного вызова для жеста, проверьте, выбран ли annotationView, и если да, выполните желаемое действие
- (void)calloutTapped:(UIGestureRecognizer *)sender {
MKAnnotationView *annotationView = (MKAnnotationView *)sender.view;
if (annotationView.selected) {
//Perform desired action on selection
}
}
Теперь это не «идеальное» решение, потому что если вы нажмете на аннотацию один раз, чтобы отобразить выноску, а затем коснитесь аннотации (не выноски) во время отображения выноски, действие будет выполнено. Однако я думаю, что это более интуитивный опыт, чем выделение вашей выноски без каких-либо действий, поэтому, учитывая выбор, я предпочитаю это.
Очевидно, что идеальным решением для Apple было бы предоставить представление выноски по умолчанию и позволить вам напрямую добавить в него gestRecognizer. Или, что еще лучше, для предоставления метода делегата, который сообщает, что обратный вызов был задействован.
Пока это не произойдет, это лучшее решение, которое я мог придумать. Надеюсь, это кому-нибудь поможет!