Подтвердить что ты не робот

Обнаружение касания в выноске в MKAnnotationView

Im работает с MKMapView и MKAnnotationView.

У меня есть аннотация на карте. Когда пользователи нажимают на него, отображается CallOut Bubble. Когда примечание снова постучивается (и отображается CallOut Bubble), мне нужно перейти к другому представлению.

Как я могу обнаружить второй кран или кран в пузырьке?

4b9b3361

Ответ 1

Не могли бы вы добавить распознаватель жестов, когда вы инициализируете MKAnnotationView?

Здесь код для внутри dequeueReusableAnnotationViewWithIdentifier:

UITapGestureRecognizer *tapGesture = 
        [[UITapGestureRecognizer alloc] initWithTarget:self 
                                        action:@selector(calloutTapped:)];
[theAnnotationView addGestureRecognizer:tapGesture];
[tapGesture release];

Метод распознавателя жестов:

-(void) calloutTapped:(id) sender { 
    // code to  display whatever is required next.

    // To get the annotation associated with the callout that caused this event:
    // id<MKAnnotation> annotation = ((MKAnnotationView*)sender.view).annotation;
}

Ответ 2

Чтобы нажать кнопку выноски после того, как пользователь нажал на представление аннотации, добавьте UITapGestureRecognizer в файле didSelectAnnotationView. Таким образом вы можете применить кран на выноске без необходимости просмотра аксессуаров.

Затем вы можете вернуть объект аннотации обратно от отправителя для дальнейших действий.

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(calloutTapped:)];
    [view addGestureRecognizer:tapGesture];
}

-(void)calloutTapped:(UITapGestureRecognizer *) sender
{
    NSLog(@"Callout was tapped");

    MKAnnotationView *view = (MKAnnotationView*)sender.view;
    id <MKAnnotation> annotation = [view annotation];
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        [self performSegueWithIdentifier:@"annotationDetailSegue" sender:annotation];
    }
}

Ответ 3

Здесь приведена быстрая версия ответа Дхану, включая получение данных из выбранного элемента для перехода к следующему контроллеру представления:

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
    let gesture = UITapGestureRecognizer(target: self, action: #selector(MyMapViewController.calloutTapped(_:)))
    view.addGestureRecognizer(gesture)
}

func calloutTapped(sender:UITapGestureRecognizer) {
    guard let annotation = (sender.view as? MKAnnotationView)?.annotation as? MyAnnotation else { return }

    selectedLocation = annotation.myData
    performSegueWithIdentifier("mySegueIdentifier", sender: self)
}

Ответ 4

Попробуйте установить собственное изображение для кнопки без изменения типа UIButtonTypeDetailDisclosure.

UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];        
[detailButton setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal];

Ответ 5

Swift 3, используя On. Вам нужно обработать rightCalloutAccessoryView

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
  switch annotation {
  case let annotation as Annotation:
    let view: AnnotationView = mapView.dequeue(annotation: annotation)
    view.canShowCallout = true
    let button = UIButton(type: .detailDisclosure)
    button.on.tap { [weak self] in
      self?.handleTap(annotation: annotation)
    }
    view.rightCalloutAccessoryView = button
    return view
  default:
    return nil
  }
}