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

Как я могу сказать UIGestureRecognizer отменить существующий штрих?

У меня есть UIPanGestureRecognizer, который я использую для отслеживания объекта (UIImageView) под пальцем пользователя. Я только забочусь о движении по оси X, и если касание уклоняется выше или ниже рамки объекта по оси Y, я хочу закончить прикосновение.

У меня есть все, что мне нужно для определения того, находится ли сенсорный объект в объекте Y, но я не знаю, как отменить сенсорное событие. Отразить свойство распознавателя cancelsTouchesInView, похоже, не делает то, что я хочу.

Спасибо!

4b9b3361

Ответ 1

Этот маленький трюк работает для меня.

@implementation UIGestureRecognizer (Cancel)

- (void)cancel {
    self.enabled = NO;
    self.enabled = YES;
}

@end

Из документации UIGestureRecognizer @enabled:

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

Ответ 2

@matej ответ в Swift.

extension UIGestureRecognizer {
  func cancel() {
    isEnabled = false
    isEnabled = true
  }
}

Ответ 3

Obj-C:

recognizer.enabled = NO;
recognizer.enabled = YES;

Swift 3:

recognizer.isEnabled = false
recognizer.isEnabled = true

Ответ 4

Как насчет этого из apple docs:

@property(nonatomic, getter=isEnabled) BOOL enabled

Отключает распознаватели жестов, чтобы он не получал штрихов. Значение по умолчанию - YES. Если вы измените это свойство на НЕТ, пока распознаватель жестов в настоящее время распознает жест, распознаватель жестов переходит в отмененное состояние.

Ответ 5

У вас есть несколько способов справиться с этим:

  • Если вы пишете пользовательский подкласс распознавателя жесты, вы можете легко сделать это, вызвав -ignoreTouch:withEvent: изнутри распознавателя, когда заметите, что он отклоняется от области, о которой вы заботитесь.

  • Поскольку вы используете стандартный распознаватель панорамы, и прикосновение начинается с OK (поэтому вы не хотите препятствовать его функциям делегата), вы действительно можете сделать свое различие только тогда, когда получаете распознаватель целевых действий. Проверьте значение Y возвращаемых значений translationInView: или locationInView: и соответствующим образом закрепите его.

Ответ 6

В соответствии с документацией вы можете подклассифицировать распознаватель жестов:

В YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h"

@implementation YourPanGestureRecognizer

- (void) cancelGesture {
    self.state=UIGestureRecognizerStateCancelled;
}

@end

В YourPanGestureRecognizer.h:

#import <UIKit/UIKit.h>
#import <UIKit/UIGestureRecognizerSubclass.h>

@interface NPPanGestureRecognizer: UIPanGestureRecognizer

- (void) cancelGesture;

@end

Теперь вы можете позвонить, если извне

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)];
[self.view addGestureRecognizer:panRecognizer];
[...]
-(void) panMoved:(YourPanGestureRecognizer*)sender {
    [sender cancelGesture]; // This will be called twice
}

Ссылка: https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc