美文网首页
Swift学习 - 手势冲突

Swift学习 - 手势冲突

作者: Tony17 | 来源:发表于2020-05-28 22:20 被阅读0次

    前言

    在App的开发过程中,手势是一个非常强大且常用的功能。对于稍微复杂一点的页面,很可能存在多种手势,而多种手势同时存在就很容易引发手势冲突,导致App体验非常不好。特别是在嵌套使用 UIScrollView 的时候,这个问题尤其突出。虽然苹果官方建议我们不要在开发过程中使用嵌套 UIScrollView,但是手势冲突的问题基本上是不可以避免的。今天就手势冲突的解决方案来做一个简单的探索。

    解决思路

    想要解决手势冲突,我们首先能想到的就是设置优先级。例如通过下面的方式来“禁用”某一个手势。

    pan.require(toFail: pan2)
    

    但是这样的操作有一个很严重的后果,那就是很可能某一个手势永远被“禁用”了。这样的结果显然不是我们所期望的。
    通过在网络上一波操作,找到了一个非常靠谱的解决方案。那就是通过实现手势的代理来进行精细化控制
    下面简单说一下操作流程。

    手势代理的方法调用顺序

    UIGestureRecognizerDelegate 的代理方法我们可以在文档中查看。下面简单介绍下这几个方法。

    /// 手势是否可以接受Event事件
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive event: UIEvent) -> Bool {}
    /// 手势是否可以接受Touch事件
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {}
    /// 当前手势是否需要取消
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {}
    /// 其他手势是否需要取消
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {}
    /// 手势是否可以开始
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {}
    /// 手势是否可以同时响应
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {}
    

    这几个方法的调用流程如下图所示:


    手势冲突-调用逻辑.jpg

    以上就是手势代理的方法调用顺序。每一步都可以根据当前状态对手势做精细化控制。在实际开发过程中为了简化代码,我们可以根据需要来选择某一个或几个方法来进行实现。

    最常见的一种方式是只实现最后一个方法,并且直接返回 true,然后在各自的手势处理方法中做处理逻辑的判断。

    最后

    以上就是本篇文章的全部内容,势必会有一些错误和遗漏,欢迎斧正~

    相关文章

      网友评论

          本文标题:Swift学习 - 手势冲突

          本文链接:https://www.haomeiwen.com/subject/azizahtx.html