iPhone: объединение MKMapView с другим UITapGestureRecognizer
Я пытаюсь реализовать свой собственный распознаватель жестов в дополнение к тому, который уже используется MKMapView. Прямо сейчас я могу нажать на карту и установить булавку. Это поведение реализуется моим UITapGestureRecognizer. Когда я нажимаю на булавку, которая уже существует, мой распознаватель жестов ничего не делает, но вместо этого отображается пузырь выноски этой булавки. UIGestureRecognizerDelegate выглядит следующим образом:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if (gestureRecognizer == self.tapRecognizer)
{
bool hitAnnotation = false;
int count = [self.mapView.annotations count];
int counter = 0;
while (counter < count && hitAnnotation == false )
{
if (touch.view == [self.mapView viewForAnnotation:[self.mapView.annotations objectAtIndex:counter]])
{
hitAnnotation = true;
}
counter++;
}
if (hitAnnotation)
{
return NO;
}
}
return YES;
}
Это прекрасно работает. Моя единственная проблема - это пузырьки выноски булавок и двойника кран. Обычно двойной кран используется для увеличения масштаба. Это все еще работает, но в дополнение к этому, я также получаю новый pin-код. Есть ли способ избежать этого?
Другая проблема возникает с пузырьком выноски булавки. Я могу открыть пузырь, нажав на штифт, не устанавливая новый штифт в этом месте (см. код выше), но когда я хочу закрыть пузырь, нажав на него, устанавливается другой штифт. Моя проблема в том, что я не могу проверить с помощью прикосновения.просмотр, если пользователь нажал на пузырь выноски, потому что он насколько я знаю, это не обычный UIView. Есть идеи или обходные пути для этой проблемы?
Спасибо
1 ответ:
У меня была та же проблема, что и у вашей первой проблемы: различение двойных кранов от одиночных кранов в
MKMapView
. Я сделал следующее:[doubleTapper release]; doubleTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapDoubleTapped:)]; doubleTapper.numberOfTapsRequired = 2; doubleTapper.delaysTouchesBegan = NO; doubleTapper.delaysTouchesEnded = NO; doubleTapper.cancelsTouchesInView = NO; doubleTapper.delegate = self; [mapTapper release]; mapTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)]; mapTapper.numberOfTapsRequired = 1; mapTapper.delaysTouchesBegan = NO; mapTapper.delaysTouchesEnded = NO; mapTapper.cancelsTouchesInView = NO; [mapTapper requireGestureRecognizerToFail:doubleTapper];
И затем реализовал следующий метод делегирования:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
Использование
requireGestureRecognizerToFail:
позволяет приложению отличать одиночные отводы от двойных отводов, а реализацияgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
гарантирует, что двойные отводы все еще перенаправляются вMKMapView
, так что он продолжает нормально масштабировать. Обратите внимание, чтоdoubleTapper
фактически ничего не делает (в моем случае, кроме log debug сообщения). Это просто манекенUIGestureRecognizer
, который используется для разделения одиночных кранов от двойных кранов.