Как я могу сказать UIGestureRecognizer отменить существующий штрих?
У меня есть UIPanGestureRecognizer
, который я использую для отслеживания объекта (UIImageView
) под пальцем пользователя. Я только забочусь о движении по оси X, и если касание уклоняется выше или ниже рамки объекта по оси Y, я хочу закончить прикосновение.
У меня есть все, что мне нужно для определения того, находится ли сенсорный объект в объекте Y, но я не знаю, как отменить сенсорное событие. Отразить свойство распознавателя cancelsTouchesInView
, похоже, не делает то, что я хочу.
Спасибо!
Ответы
Ответ 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