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; 
}

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

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

Спасибо


person Lars    schedule 10.08.2011    source источник


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

person charshep    schedule 24.08.2011
comment
Привет, чаршеп, Большое спасибо за ответ. Это указывало мне на правильное направление. Первая проблема вроде бы решена. Есть ли у вас предложения по второй проблеме? - person Lars; 07.09.2011