ios – 一起识别长按和平移手势识别器

ios – 一起识别长按和平移手势识别器,第1张

概述我有一个观点,我已经添加了泛和长按UIGestureRecognizer.平底锅用于移动视图.我想做的是注意触摸已停止移动(同时保持活动状态)并触发长按. 我发现在平底锅开始后从未触发长按.我已经尝试设置委托并实现: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultane 我有一个观点,我已经添加了泛和长按UIGestureRecognizer.平底锅用于移动视图.我想做的是注意触摸已停止移动(同时保持活动状态)并触发长按.

我发现在平底锅开始后从未触发长按.我已经尝试设置委托并实现:

- (BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {    NSLog(@"simultaneous %@",gestureRecognizer.class);    return YES;}- (BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {    NSLog(@"require fail %@",gestureRecognizer.class);    return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer self]];    // also trIEd return YES;    // also trIEd return [gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer self]];}

我试过愚弄pan gr的allowableMovement,也无济于事.我只是放弃并在pan gr中使用一个计时器,它被取消,然后重置动作,但我希望SDK能为我做状态机的东西.

解决方法 如果其他人需要它,这里的代码对我有用.目标是使视图对长按和平移敏感,包括不按平底锅的长按,反之亦然.

// setup@property (strong,nonatomic) NSTimer *timer;          // triggers the long press during pan@property (strong,nonatomic) UIVIEw *longPressVIEw;   // need this to track long press state// vIEw is the vIEw we're interested in panning and long pressingUIPanGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pangr:)];[vIEw addGestureRecognizer:pangr];// this starts a long press when no pan has occurredUILongPressGestureRecognizer *longGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGR:)];[vIEw addGestureRecognizer:longGR];

当平底锅开始或更改时,启动计时器.如果计时器在平移结束之前到期(触摸释放),那么我们需要长按.

- (voID)pangr:(UIPanGestureRecognizer *)gr {    if (gr.state == UIGestureRecognizerStateBegan) {        [self startTimer:gr.vIEw];    } else if (gr.state == UIGestureRecognizerStateChanged) {        [self startTimer:gr.vIEw];        // do whatever you want to do with pan state in this method        // in my case,I'm translating the vIEw here    } else if (gr.state == UIGestureRecognizerStateEnded) {        if (self.longPressVIEw) {            [self longPressEnded];        } else {            [self.timer invalIDate];        }    }}

我们给视图的计时器用户信息.您可能需要存储手势状态的其他部分,如位置等.使用用户信息字典以相同的方式.

- (voID)startTimer:(UIVIEw *)vIEw {    if (self.longPressVIEw) return;    [self.timer invalIDate];    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.8 target:self                                                selector:@selector(longPresstimer:)                                                userInfo:@{ @"vIEw": vIEw} repeats:NO];}-(voID)longPresstimer:(NSTimer *)timer {    self.longPressVIEw = timer.userInfo[@"vIEw"];    [self longPressBegan];}

由于timer方法没有关联的gr,因此将我们通常放在gr处理程序中的所有逻辑分解出来,这样定时器处理程序和gr处理程序就可以调用它.

- (voID)longPressGR:(UILongPressGestureRecognizer *)gr {    if (gr.state == UIGestureRecognizerStateBegan) {        self.longPressVIEw = gr.vIEw;        [self longPressBegan];    } else if (gr.state == UIGestureRecognizerStateEnded) {        [self longPressEnded];    }}- (voID)longPressBegan {    NSLog(@"long press began");}- (voID)longPressEnded {    self.longPressVIEw = nil;    NSLog(@"long press ended");}
总结

以上是内存溢出为你收集整理的ios – 一起识别长按和平移手势识别器全部内容,希望文章能够帮你解决ios – 一起识别长按和平移手势识别器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1055385.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存