iPhone: объединение MKMapView с другим UITapGestureRecognizer - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь реализовать свой собственный распознаватель жестов в дополнение к уже используемому 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; 
}

Это отлично работает. Моя единственная проблема - пузырьки выноски контактов и двойное нажатие. Обычно для увеличения используется двойной тап. Это все еще работает, но в дополнение к этому я также получаю новый пин-код. Есть ли способ избежать этого?

Другая проблема возникает с пузырьком выноски булавки. Я могу открыть пузырь, нажав на булавку, не устанавливая новый штифт в этом месте (см. Код выше), но когда я хочу закрыть пузырь, нажав на него, устанавливается другой штифт. Моя проблема в том, что я не могу проверить с помощью touch.view, нажал ли пользователь на всплывающую подсказку, потому что, насколько я знаю, это не обычный UIView. Любые идеи или обходные пути для этой проблемы?

Спасибо

1 Ответ

4 голосов
/ 25 августа 2011

У меня была та же проблема, что и у вашей первой проблемы: отличить двойные касания от одиночных нажатий в 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 на самом деле ничего не делает (в моем случае, кроме сообщений отладки журнала).Это просто фиктивная UIGestureRecognizer, которая используется для отделения отдельных нажатий от двойных нажатий.

...