ios - 是否可以将 UIPanGestureRecognizer 子类化以使其在达到某个距离阈值后出现开始状态

标签 ios objective-c uigesturerecognizer uipangesturerecognizer

我想对 UIPanGestureRecognizer 进行子类化,以便在我的子类中只有在平移过程中达到某个距离阈值后,状态才会更改为 UIGestureRecognizerStateBegan。这意味着经过一定程度的平移后,我希望平移手势的状态变为 UIGestureRecognizerStateBegan。

我尝试插入 touchesBegan 并手动将状​​态设置为失败,然后在 touchesMoved 中将其更新为开始,但我只想将其更改为开始一次(即第一次达到阈值时,后续交互将是 UIGestureRecognizerStateChanged

这可能吗?

最佳答案

这是一个似乎有效的子类。它会延迟“开始”状态,直到达到所需的距离。

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];

以及 Action :

- (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
    }
}

关于ios - 是否可以将 UIPanGestureRecognizer 子类化以使其在达到某个距离阈值后出现开始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752248/

相关文章:

ios - ReactiveCocoa : View doesn't update when ViewModel property changes

ios - UIScrollView 当 contentOffset 不在原点时,不会触发附加到 subview 的 UIGestureRecognizers

iphone - Twitter API : OAuth vs. xAuth

ios - 将来自不同 viewController 的字符串保存到 plist 而不会覆盖旧的

ios - 从当前比例捏合/缩放

ios - 如何将触摸手势添加到 map 但忽略引脚和注释上的触摸?

ios - Facebook SDK 4.0 - currentAccessToken 在 loginButton didCompleteWithResult 中仍然为零

iphone - 自动升级 iOS 应用

ios - 从 Firebase 数据库中获取随机 child

iOS 用户界面 - 这个用户界面是如何在 YouTube 和 Facebook 应用程序中实现的