MkMapView tap + Редактирование аннотации

У меня есть MkMapView, на котором у меня есть аннотации. Когда я нажимаю аннотацию, его деталь открывается в другом представлении, которое имеет вид прокрутки в нижней половине отображения карты. Когда мы просматриваем scrollview, карта сосредотачивается на следующей аннотации, и ее детали отображаются в scrollview.

Моя проблема в том, что я хочу добавить кран на карте, чтобы при нажатии на карту прокрутка должна скрываться. Для этого я добавил на карту UiTapGesture, которая также отлично работает, но проблема в том, что аннотации на карте больше не остаются скрытыми. Карта всегда идет на действие tapgesture и никогда больше не вызывает метод selectannotation?

Как я могу исправить эту проблему ????

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

При создании жесты касания установите его делегат:

 tapGR.delegate = self;  //also add <UIGestureRecognizerDelegate> to @interface 

и реализовать метод:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer    :(UIGestureRecognizer *)otherGestureRecognizer {  return YES; } 

Теперь вы didSelectAnnotationView как ваш метод жестов, так и didSelectAnnotationView .

Предполагая, что ваш обработчик крана вызывается первым, вы можете удалить и nil scrollview, а затем didSelectAnnotationView создаст и добавит scrollview. Если последовательность оказывается другой, вам может потребоваться добавить несколько флагов для координации удаления / создания.

Не чистый путь, но единственный способ, которым я мог найти, – проверить все видимые аннотации внутри метода shouldBeginGestureRecognizer:

 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { CGPoint p = [gestureRecognizer locationInView:self.mapView]; NSLog(@"touch %f %f",px,py); MKMapRect visibleMapRect = self.mapView.visibleMapRect; NSSet *visibleAnnotations = [self.mapView annotationsInMapRect:visibleMapRect]; for ( MyCustomAnnotation *annotation in visibleAnnotations ){ UIView *av = [self.mapView viewForAnnotation:annotation]; if( CGRectContainsPoint(av.frame, p) ){ // do what you wanna do when Annotation View has been tapped! return NO; } } return YES; } 

Я думаю, вы должны добавить только распознаватель жестов, когда отображается прокрутка. Как я делаю с клавиатурой в примере ниже 1. Когда клавиатура отображается, mapView добавляет жест выделения 2. Когда я удаляю, я удаляю распознаватель жестов.

 // Call this method somewhere in your view controller setup code. - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } // Called when the UIKeyboardDidShowNotification is sent. - (void)keyboardWasShown:(NSNotification*)aNotification { self.tapMapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; self.tapMapGestureRecognizer.cancelsTouchesInView = NO; [self.parkingsMapView addGestureRecognizer:self.tapMapGestureRecognizer]; } // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillBeHidden:(NSNotification*)aNotification { [self.parkingsMapView removeGestureRecognizer:self.tapMapGestureRecognizer]; } -(void) hideKeyboard{ [self.searchbar resignFirstResponder]; } 
Interesting Posts
Давайте будем гением компьютера.