Как я могу добавить жест на CallOutBubble - PullRequest
1 голос
/ 02 апреля 2012

В моем приложении для iphone я хочу, чтобы пользователь мог нажать на всплывающую подсказку, чтобы перейти к другому представлению, как я могу добавить жест к всплывающей подсказке

Я пытался наложить жест на MKAnnotationView, когда пользовательвыберите аннотацию

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
   UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showItem:)];
   tapped.numberOfTapsRequired = 1;
   view.userInteractionEnabled = YES;
   [view addGestureRecognizer:tapped];
}

, но для пузыря это не поможет?

Ответы [ 2 ]

1 голос
/ 02 апреля 2012
  1. Вы установили распознаватель жестов в представлении аннотации (булавка), а не в выноске, которая является отдельным представлением.Кроме того, я не уверен, что распознаватель будет работать из-за конфликтов с распознавателями карты.

  2. Как комментирует @CyrilGodefroy, то, что вы делаете, сложнее, чем меньшеузнаваем для пользователей, чем стандартный способ помещения элементов управления в пузырь выноски.Фреймворк предоставляет вспомогательные виды выноски для этой цели:

    - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
        // Add a detail disclosure button to the callout.
        UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton addTarget:self action:@selector(myShowDetailsMethod:) forControlEvents:UIControlEventTouchUpInside];
        view.rightCalloutAccessoryView = rightButton;
    }
    
0 голосов
/ 09 сентября 2015

Желаемое поведение - иметь возможность касаться в любом месте пузырька выноски и заставлять его выполнять действие кнопки в 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. Или, что еще лучше, для предоставления метода делегата, который сообщает, что обратный вызов был задействован.

Пока это не произойдет, это лучшее решение, которое я мог придумать. Надеюсь, это кому-нибудь поможет!

...