Ответ 1
Существует два способа обнаружения взаимодействия пользователя с вашим аннотационным представлением. Общей методикой является определение выноски (этот стандартный маленький пузырь, который вы видите, когда вы нажимаете на булавку в типичном приложении для карт) для вашего MKAnnotationView
. И вы создаете аннотацию для своей аннотации в стандартном методе viewForAnnotation
:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
}
При этом вы получаете выноску, но вы добавляете правильный аксессуар, который, в моем примере выше, является индикатором раскрытия. Таким образом, они нажимают на ваш аннотационный вид (в моем примере выше, вырез на карте), они видят выноску, и когда они нажимают на этот аксессуар правой руки (маленький индикатор раскрытия информации в этом примере), ваш calloutAccessoryControlTapped
(в моем примере ниже, выполняя segue для некоторого контроллера подробного представления):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
Это очень типичный пользовательский интерфейс на маленьком экране iPhone.
Но если вам не нравится этот UX, и вам не нужна стандартная выноска, но вы хотите, чтобы что-то еще произошло, вы можете определить свой MKAnnotationView
, чтобы выноска не была показана, но вместо этого вы перехватите его и сделайте что-нибудь еще (например, в приложениях для iPad-карт, вы можете показать более сложный popover, а не стандартную выноску). Например, вы можете иметь MKAnnotationView
не показывать выноску:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = NO;
return annotationView;
}
Но вы можете вручную обработать didSelectAnnotationView
, чтобы определить, когда пользователь нажал на ваш MKAnnotationView
, в этом примере показано popover:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[mapView deselectAnnotation:view.annotation animated:YES];
DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
controller.annotation = view.annotation;
self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
self.popover.delegate = self;
[self.popover presentPopoverFromRect:view.frame
inView:view.superview
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
Я включаю некоторые снимки экрана для пользовательского интерфейса, предоставленные приведенным выше кодом, в моем ответе здесь.