Можно ли создать подкласс UIPanGestureRecognizer, чтобы его начальное состояние возникало после достижения некоторого порогового значения расстояния - PullRequest
0 голосов
/ 08 июня 2018

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

Я попытался подключиться к touchesBegan и установить состояние вручную как сбойное, а затем в touchesMoved обновил его, чтобы начать, но я хочу изменить его, чтобы начать один раз (т.е. в первый раз, когда оно достигаетпорог и затем последующие взаимодействия будут UIGestureRecognizerStateChanged

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вот подкласс, который, кажется, работает.Он задерживает состояние «начало» до тех пор, пока не будет достигнуто желаемое расстояние.

DelayedPanGestureRecognizer.h:

#import <UIKit/UIKit.h>

@interface DelayedPanGestureRecognizer : UIPanGestureRecognizer

@property (nonatomic, assign) CGFloat delay;

@end

DelayedPanGestureRecognizer.m:

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

@implementation DelayedPanGestureRecognizer

- (void)setState:(UIGestureRecognizerState)state {
    if (state == UIGestureRecognizerStateBegan) {
        CGPoint trans = [self translationInView:self.view];
        if (trans.x * trans.x + trans.y * trans.y > self.delay * self.delay) {
            [super setState:state];
        }
    } else {
        [super setState:state];
    }
}

@end

Использование:

DelayedPanGestureRecognizer *pan = [[DelayedPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)];
pan.delay = 6;
[someView addGestureRecognizer:pan];

И действие:

- (void)panned:(DelayedPanGestureRecognizer *)gesture {
    NSLog(@"State: %d", (int)gesture.state);
    NSLog(@"%@", NSStringFromCGPoint([gesture translationInView:gesture.view]));

    if (gesture.state == UIGestureStateBegan) {
        // do something
    } else if (gesture.state == UIGestureStateChanged) {
        // do other things
    }
}
0 голосов
/ 08 июня 2018
// called when a gesture recognizer attempts to transition out of UIGestureRecognizerStatePossible. returning NO causes it to transition to UIGestureRecognizerStateFailed
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

Просто верните НЕТ, прежде чем выполнять условия.

...