Подтвердить что ты не робот

UILongPressGestureRecognizer отключает выделение UIButton

У меня есть UILongPressGestureRecognizer, добавленный в UIButton. Когда я нажимаю UIButton, он подсвечивается, как ожидалось. Однако, когда выбран селектор UILongPressGestureRecognizer, подсветка отключается.

    UILongPressGestureRecognizer *longpressGesture = 
     [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                            action:@selector(longPressHandler:)];
    longpressGesture.minimumPressDuration = 5;
    [longpressGesture setDelegate:self];
    [self.myUIButton addGestureRecognizer:longpressGesture];
    [longpressGesture release];

    - (void)longPressHandler:(UILongPressGestureRecognizer *)gestureRecognizer {
    NSLog(@"longPressHandler");
}

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

Может ли кто-нибудь объяснить, почему это происходит, и как его можно предотвратить? Я хотел бы, чтобы кнопка оставалась подсвеченной все время при нажатии. Спасибо.

4b9b3361

Ответ 1

После дальнейших исследований я обнаружил, что это связано с поведением Gesture Recognizers по умолчанию, которое отменяет прикосновения в иерархии, когда они распознают жест. Таким образом, как только распознаватель жестов распознает жест, он отменяет прикосновение к кнопке пользовательского интерфейса, которая затем становится бессознательной, поскольку она больше не имеет события касания.

Это поведение можно изменить с помощью свойства cancelsTouchesInView

longpressGesture.cancelsTouchesInView = NO;

Настройка этого параметра на NO приведет к касанию к цепочке ответчиков.

Ответ 2

Это несколько умозрительно..: Я подозреваю, что стрельба из GestureRecognizer заставляет кнопки размещаться в цепочке ответчиков, что делает ее свободной фокусировкой. Я не могу думать о том, чтобы предотвратить это, но могут быть некоторые обходные пути:

  • В методе длинного нажатия используется кнопка, чтобы продолжить показывать нажатое состояние. Это возможно очень грязный способ сделать это.
  • не используйте распознаватель жестов. Вместо этого сразу же после нажатия кнопки создайте таймер, который через 5 секунд вызывает какой-то селектор. Если кнопка отпускается до истечения времени, просто отключите таймер. Это должно быть более "чистым" решением, однако, если вы намерены использовать распознаватель жестов, это не поможет.