фильтрация одиночных и двойных отводов - PullRequest
17 голосов
/ 05 июля 2011

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

Проблема в том, что двойное нажатие вызывает одиночное нажатие, и это приводит к ошибкам в моей логике. Я не могу использовать UIGestureRecognizer, потому что мне нужно следить за точками.

Я пробую несколько логических значений, но без шансов. Я также попробовал метод отмены / perfomSelector-delay, но он не работает (это странно, потому что другие люди на других форумах говорили, что это работает, может быть, обнаружение касания симулятора отличается?)

Я пытаюсь позволить пользователю установить положение (перетаскивание, вращение) части доски, но мне нужно знать о пересечениях фигур, обрезать область доски и т.д., поэтому простое логическое значение не решит проблема.

Заранее спасибо!

Ответы [ 4 ]

45 голосов
/ 05 июля 2011

Проверьте это , кажется правильным то, что вы ищете:

Ниже кода используется UITapGestureRecognizer для обработки одного и двух нажатий. Код разработан так, что он не будет запускать одно нажатие, если мы получили событие двойного нажатия. Хитрость заключается в том, чтобы использовать requireGestureRecognizerToFail, чтобы запросить жест с одним касанием дождаться, пока событие двойного касания не сработало, прежде чем оно сработает. Поэтому, когда пользователь нажимает на экран, распознаватель жестов одним касанием не будет запускать событие до тех пор, пока распознаватель жестов двойного нажатия. Если распознаватель жестов с двойным касанием распознает событие, он запустит событие с двумя вкладками и пропустит событие с одним касанием, в противном случае сработает событие с одним касанием.

    UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                            initWithTarget:self action:@selector(handleDoubleTap:)];
    doubleTapGestureRecognizer.numberOfTapsRequired = 2;

    //tapGestureRecognizer.delegate = self;
    [self addGestureRecognizer:doubleTapGestureRecognizer];

    //
    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    singleTapGestureRecognizer.numberOfTapsRequired = 1;

    [singleTapGestureRecognizer requireGestureRecognizerToFail: doubleTapGestureRecognizer];
    //tapGestureRecognizer.delegate = self;
    [self addGestureRecognizer:singleTapGestureRecognizer];

Возможно, я не совсем понимаю, что вы подразумеваете под "мне нужно следить за точками", но я не вижу никаких проблем с этим с помощью распознавателя жестов.

2 голосов
/ 27 октября 2016

Swift 3 Решение:

doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2


singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1

singleTap.require(toFail: doubleTap)

self.view.addGestureRecognizer(doubletap)
self.view.addGestureRecognizer(singleTap)

В строке кода singleTap.require (toFail: doubleTap) мы форсируемодно нажатие, чтобы подождать и убедиться, что даже касание не является двойным нажатием.Это означает, что мы просим убедиться, что событие двойного касания не удалось, поэтому оно завершается как одно касание.

1 голос
/ 10 сентября 2015

Свифт Решение:

    doubleTapSmall1.numberOfTapsRequired = 2
    doubleTapSmall1.addTarget(self, action: "doubleTapPic1")
    smallProfilePic1.addGestureRecognizer(doubleTapSmall1)

    singleTapSmall1.numberOfTapsRequired = 1
    singleTapSmall1.addTarget(self, action: "singleTapPic1")
    singleTapSmall1.requireGestureRecognizerToFail(doubleTapSmall1)
    smallProfilePic1.addGestureRecognizer(singleTapSmall1)
0 голосов
/ 10 мая 2017

Просто реализуйте методы делегата UIGestureRecognizer, правильно установив делегат.

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
            return  YES;
        }

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

Также добавьте эту строку кода

[singleTap requireGestureRecognizerToFail:doubleTap];
...