Подкласс UIPanGestureRecognizer для ожидания условия перед распознаванием - PullRequest
3 голосов
/ 24 августа 2011

Я пытаюсь связать два жеста один за другим.UILongPressGestureRecognizer, затем UIPanGestureRecognizer.

Я хочу обнаружить долгое нажатие, затем разрешить распознавание жеста панорамирования.

Я создал подкласс UIPanGestureRecognizer и добавил PanEnabled Bool iVar.В кадре initWith я установил для panEnabled значение NO.

В Touches Moved я проверяю, включена ли она, и затем вызываю Super touchesMoved, если она есть.

В моем обработчике жестов LongPress я зацикливаюсь через Жесты представления, пока не найду свой подклассЖест, а затем установитеPanEnabled на ДА.

Кажется, что он работает, хотя он, как и оригинальный распознаватель жестов панорамирования, не работает должным образом и не устанавливает правильные состояния.Я знаю, что если вы создаете подкласс UIGestureRecognizer, вам нужно поддерживать это состояние самостоятельно, но я думаю, что если вы создаете подкласс UIPanGestureRecognizer и для всех методов касаний, вызывающих super, он будет устанавливать это состояние там.

Вот мой подкласс .h Файл

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

@interface IoUISEListPanGestureRecognizer : UIPanGestureRecognizer {
    int IoUISEdebug;
    BOOL panEnabled;    
}
- (id)initWithTarget:(id)target action:(SEL)action;
@property(nonatomic, assign) int IoUISEdebug;
@property(nonatomic, assign) BOOL panEnabled;

@end

Вот подкласс .m Файл

#import "IoUISEListPanGestureRecognizer.h"

@implementation IoUISEListPanGestureRecognizer
@synthesize IoUISEdebug;
@synthesize panEnabled;

- (id)initWithTarget:(id)target action:(SEL)action {
    [super initWithTarget:target action:action];
    panEnabled = NO;
    return self;
}

- (void)ignoreTouch:(UITouch*)touch forEvent:(UIEvent*)event {
    [super ignoreTouch:touch forEvent:event];
}

-(void)reset {
    [super reset];
    panEnabled = NO;
}

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer {  
    return [super canPreventGestureRecognizer:preventedGestureRecognizer];
}

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer{
    return [super canBePreventedByGestureRecognizer:preventingGestureRecognizer];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if (panEnabled) {
        [super touchesMoved:touches withEvent:event];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];    
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesCancelled:touches withEvent:event];
}
@end

1 Ответ

4 голосов
/ 19 октября 2011

Если вы создадите BOOL с именем canPan и включите следующие методы делегата, вы можете иметь как стандартный UILongPressGestureRecognizer, так и UIPanGestureRecognizer, присоединенные к одному и тому же представлению. На селекторе, который вызывается при распознавании длинного нажатия, измените canPan на YES. Возможно, вы захотите отключить длительное нажатие после того, как оно будет распознано, и повторно включить его, когда панорамирование завершится. - Не забудьте назначить свойства делегата распознавателям жестов.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    if (!canPan && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
      return NO;
    }

    return YES;
}

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