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 2

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, который используется для разделения одиночных кранов от двойных кранов.