iOS开发中多手势冲突解决方案

iOS开发中多手势冲突解决方案

iOS开发中我们经常会使用到手势,合理的运用手势会使我们的app拥有更好的体验,但是在使用手势的同时也要注意避免手势和手势间,以及手势和其他控件间的冲突。本文就主要介绍在遇到多手势冲突的问题是, 怎么合理解决问题, 运用多手势营造更好的体验?

手势冲突解决方案

首先, 先介绍我在项目开发中遇到的手势冲突的情景, 主要使用到的手势就是UIScreenEdgePanGestureRecognizer, UIPanGestureRecognizer,UITapGestureRecognizer以及scrollview的panGestureRecognizer, 其中会造成冲突的就有UIScreenEdgePanGestureRecognizer,UIPanGestureRecognizer,scrollview的panGestureRecognizer, 这里主要是滑动手势引起的冲突, 其实解决方法也比较简单, 个人理解就是设置手势的优先级, 哪个手势最先识别, 哪个最后识别?

其实解决方法也比较简单:查看UIGestureRecognizer文档, 我们会发现这样一个方法:

// create a relationship with another gesture recognizer that will prevent this gesture's actions from being called until otherGestureRecognizer transitions to UIGestureRecognizerStateFailed
// if otherGestureRecognizer transitions to UIGestureRecognizerStateRecognized or UIGestureRecognizerStateBegan then this recognizer will instead transition to UIGestureRecognizerStateFailed
// example usage: a single tap may require a double tap to fail
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

其实也就是说, 某个手势会在另外一个手势识别出来后, 响应失败, 就响应另外一个手势,其实也就是设置手势的响应优先级。

在我的项目中, 屏幕侧滑的优先级是最高的,关于不同区域的滑动手势, 其实是可以根据响应区域来区分的, 不一定需要设置优先级。

我的处理方式如下:

    //需要设置屏幕边缘滑动优先级高于正常滑动手势
    [panGestureRecognizer requireGestureRecognizerToFail:screenLeftEdgePanGestureRecognizer];
    [panGestureRecognizer requireGestureRecognizerToFail:screenRightEdgePanGestureRecognizer];
    [self.scrollViewBooks.panGestureRecognizer requireGestureRecognizerToFail:gesture];

我这里涉及到左, 右屏幕边缘的侧滑手势, 设置起来可能比较多。

其实还有一种遍历的设置方法:

    //设置scrollView的滑动优先级低于屏幕边缘滑动
    NSArray *gestureArray = self.view.gestureRecognizers;
    //当是侧滑手势的时候设置scrollview需要此手势失效才生效即可
    for (UIGestureRecognizer *gesture in gestureArray) {
        if ([gesture isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
            [self.scrollViewBooks.panGestureRecognizer requireGestureRecognizerToFail:gesture];
        }
    }

这里主要是应对scrollView的滑动手势对屏幕边缘滑动手势的影响, 这种设置可能更高效。

总结

其实, 手势冲突最根本的解决方法就是尽量避免多手势的问题, 不使用相互冲突的手势, 如果真的没法避免, 建议大家使用上述的方法来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值