首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检测多个UIGestureRecognizers端?

如何检测多个UIGestureRecognizers端?
EN

Stack Overflow用户
提问于 2020-03-01 00:49:03
回答 1查看 634关注 0票数 0

在我看来,我有多个手势识别器(UIPanGestureRecognizer、UIPinchGestureRecognizer和UIRotationGestureRecognizer),我允许它们同时检测触摸:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer.view != otherGestureRecognizer.view {
       return false
    }

    return true
}

这种方法的问题是,我不再能够检测到所有三个手势何时结束。我不能用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if gesture.state == .ended || gesture.state == .cancelled {
    }

因为这只对手势识别器有效,而不适用于所有3。

知道所有活动识别器何时结束时是否存在要检测的api吗?

谢谢

溶液

这是可行的,但很难看:基本上,我会跟踪所有三个手势识别器何时结束,并防止多次检测结束,因为识别器回调可以按任何顺序调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SCCanvasViewController: UIViewController {
    var gesturesAlreadyEnded = false

    lazy var panGestureRecognizer: UIPanGestureRecognizer = {
        let gr = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        gr.delegate = self
        return gr
    }()

    lazy var pinchGestureRecognizer: UIPinchGestureRecognizer = {
        let gr = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
        gr.delegate = self
        return gr
    }()

    lazy var rotateGestureRecognizer: UIRotationGestureRecognizer = {
        let gr = UIRotationGestureRecognizer(target: self, action: #selector(handleRotation(_:)))
        gr.delegate = self
        return gr
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addGestureRecognizer(panGestureRecognizer)
        view.addGestureRecognizer(pinchGestureRecognizer)
        view.addGestureRecognizer(rotateGestureRecognizer)
    }

    func isGestureEnded(gesture: UIGestureRecognizer) -> Bool {
        return gesture.state == .ended || gesture.state == .cancelled || gesture.state == .failed
    }

    func allGesturesEnded() -> Bool {
        let panEnded = isGestureEnded(gesture: panGestureRecognizer)
        let pinchEnded = isGestureEnded(gesture: pinchGestureRecognizer)
        let rotationEnded = isGestureEnded(gesture: rotateGestureRecognizer)
        return panEnded && pinchEnded && rotationEnded
    }

    @objc func handlePan(_ gesture: UIPanGestureRecognizer) {
        if gesture.state == .began {
            gesturesAlreadyEnded = false
        }

        if !gesturesAlreadyEnded && isGestureEnded(gesture: gesture) {
            canvasView.showHorizontalSnapIndicators(areVisible: false)
            canvasView.showVerticalSnapIndicators(areVisible: false)
            if (allGesturesEnded()) {
                gesturesAlreadyEnded = true
                print("Can create transformation command")
            }
            return
        }
    }

    @objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
        if gesture.state == .began {
            gesturesAlreadyEnded = false
        }

        if !gesturesAlreadyEnded && isGestureEnded(gesture: gesture) {
            if (allGesturesEnded()) {
                gesturesAlreadyEnded = true
                print("Can create transformation command")
            }
            return
        }
    }

    @objc func handleRotation(_ gesture: UIRotationGestureRecognizer) {
        if gesture.state == .began {
            gesturesAlreadyEnded = false
        }

        if !gesturesAlreadyEnded && isGestureEnded(gesture: gesture) {
            if (allGesturesEnded()) {
                gesturesAlreadyEnded = true
                print("Can create transformation command")
            }
            return
        }
    }
}

extension SCCanvasViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer.view != otherGestureRecognizer.view {
           return false
        }

        return true
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-01 06:59:52

设置它以获得多点触摸通知,然后检查受事件影响的触点集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TouchableView: UIView {
   var touchViews = [UITouch:TouchSpotView]() 

   override init(frame: CGRect) {
      super.init(frame: frame)
      isMultipleTouchEnabled = true
   }

   required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)
      isMultipleTouchEnabled = true
   }

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
         createViewForTouch(touch: touch)
      }
   }

   override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
         let view = viewForTouch(touch: touch) 
         // Move the view to the new location.
         let newLocation = touch.location(in: self)
         view?.center = newLocation
      }
   }

   override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
         removeViewForTouch(touch: touch)
      }
   }

   override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
         removeViewForTouch(touch: touch)
      }
   }

   // Other methods. . . 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60473433

复制
相关文章
iOS开发之手势识别
  感觉有必要把iOS开发中的手势识别做一个小小的总结。在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标动作回调,话不多说,切入今天的正题。总共有六种手势识别:轻击手势(TapGestureRecognizer),
lizelu
2018/01/11
2.7K0
iOS开发之手势识别
OpenGLES-05 立方体3D变换
开始这篇文章之前,请先了解3D变换的相关知识,下面资料写得很好,请确保已经阅读过有关资料。 1.http://www.cnblogs.com/kesalin/archive/2012/12/06/3D_math.html 2.http://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/07%20Transformations/ (1.2为3D变换知识)另外推荐下面资料,关于坐标系统的,我觉得最好理解坐标系统的资料,请都阅读
清墨
2018/05/07
1.1K0
OpenGLES-05 立方体3D变换
当不使用会话状态时禁用它
并不是所有的应用程序或页都需要针对于具体用户的会话状态,您应该对任何不需要会话状态的应用程序或页禁用会话状态。
Java架构师必看
2021/03/22
5100
VC 6 编译时一直处于Linking…状态,无响应
我安装上VC后,一编译程序,要么一直处于编译状态,要么处于linking…状态,VC就像死了一样。
全栈程序员站长
2022/07/04
7940
接口需要 SDK 处于 ready 状态后才能调用(附解决办法)
let promise = tim.login({userID: 'your userID', userSig: 'your userSig'});
用户1419762
2020/04/07
14.1K9
接口需要 SDK 处于 ready 状态后才能调用(附解决办法)
删除处于Terminating状态的namespace
可以看到monitoring这个namespace一直处于Terminating状态,一般情况下强删是删不掉的,强删的方法如下:
dogfei
2020/08/19
1.1K0
活动状态检查
通过查询基本视图,确认数据库和实例处于正常运行状态,可以对外提供数据服务。1.1实例状态1.1实例状态SELECT instance_name,status FROM gv$instance;查询返回实例名称、状态,正常状态应为Open。$crsctl status resource –t集群状态select name,open_mode from v$PDBS;PDB状态GDSCTL> config shardSharding状态1.2会话信息1.2会话信息SELECTSESSIONS_CURRENT,
用户8006012
2022/06/23
1.5K0
TienChin 活动管理-活动状态完善
编写一个将超过当前时间的活动状态设置为禁用,在列表查询的时候进行更改一下调用一下方法。
程序员 NEO
2023/10/12
1680
TienChin 活动管理-活动状态完善
Mac关机时处于黑屏状态
PS:不知道大家有没有遇到过mac电脑关机就黑屏,只有一个箭头,还可以滑动箭头,但就是黑屏状态,等个好长时间还是关不了机,因此我查了好多资料,原因是在关机时,mac要先关掉其他软件或者保存进程以备下次开机的时候接着用,我觉得我也没什么装的呀,是什么让它长时间关不了机呢,原来是MySql,我的MySql一直是处于start状态,我把这个关掉以后,再关机就是秒关了,开机后MySql也是自启的,没有其他坏的影响,只要每次关机的时候把这种后台服务的软件关掉就好了,Mac一般也不常关机,每次手动关掉也不费事。小伙伴们
cMusketeer
2018/03/28
1.8K0
Mac关机时处于黑屏状态
二极管处于截止状态时电压为多少_放大电路饱和失真
大家好,又见面了,我是你们的朋友全栈君。 1.截止状态所谓截止,就是三极管在工作时,集电极电流始终为0。此时,集电极与发射极间电压接近电源电压。对于NPN 型硅三极管来说,当U be在0~0.5V 之间时,I b很小,无论I b怎样变化,I c都为0。此时,三极管的内阻(Rce)很大,三极管截止。当在维修过程中,测得U be低于0.5V 或Uce接近电源电压时,就可知道三极管处在截止状态。 当 U be在0.5~0.7V 之间时,U be的微小变化就能引起I b的较大变化,I b随U be基本呈线性变化,从而引起I c的较大变化(I c=βI b)。这时三极管处于放大状态,集电极与发射极间电阻(Rce)随U be可变。当在维修过程中,测得U be在0.5~0.7V 之间时,就可知道三极管处在放大状态。 3.饱和状态
全栈程序员站长
2022/09/30
7530
该硬盘处于脱机状态解决方案
最近在一台电脑上使用U盘时发现连接后不会出现盘符,但设备管理器却能够显示大容量存储设备。起初以为是系统没有分配盘符,进入到磁盘管理发现磁盘处于脱机状态,并且显示:该磁盘处于脱机状态,因为它与另一个联机磁盘发生签名冲突。经过一番研究找到了解决方案,在此记录备查,也希望能够帮到其他人。
reizhi
2022/09/26
4.6K0
该硬盘处于脱机状态解决方案
Windows中磁盘处于脱机状态怎么解决
超融合中的windows虚拟机在新增硬盘之后,查看计算机本地,没有发现磁盘,此时只需要打开控制面板\所有控制面板项\管理工具中的计算机管理,之后再打开存储中的磁盘管理即可看到添加的磁盘。硬盘激活上线
小狐狸说事
2022/11/17
2K0
Windows中磁盘处于脱机状态怎么解决
juc04-验证线程处于临时状态
当一个线程被启动时,并不代表线程就有了执行权。 线程处于临就绪状态并没有执行权,这个时候 main 线程继续往下执行,有可能是别的线程先开始执行。
潇洒
2023/10/20
880
IL3002:当发布为单个文件时,避免调用
将应用发布为单个文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用使用 RequiresAssemblyFilesAttribute 属性注释的成员与单文件不兼容。 这些调用可能不兼容,因为使用此属性注释的成员要求程序集文件位于磁盘上,而嵌入单文件应用的程序集已加载到内存中。
呆呆
2022/02/26
4580
Python调用Ant构建时根据构建状态来决定命令行退出状态
使用os.system()调用Ant构建时,不论构建成功还是失败(BUILD SUCCESSFUL/BUILD FAILED),命令行的总是正常退出 要解决问题: 首先想到的是获取ant命令的返回值,根据返回值来决定命令行的退出状态(0或非0,0代表正常退出) 查阅相关资料,得知python调用系统命令的函数有:os.system、os.popen、commands.getstatusoutput/getstatus/getoutput、subprocess.Popen等。
donghui
2019/04/19
1.1K0
【提问帖】GO中调用redis时,当并发量比较大时出现的问题。
GO中调用redis时,实始化一个连接池,做法也是一般的用户: &redis.Pool{ MaxIdle: beego.AppConfig.DefaultInt("redis::maxidle", 1), MaxActive: beego.AppConfig.DefaultInt("redis::maxactive", 10), IdleTimeout: time.Duration(beego.AppConfig.DefaultInt64("redis::idle_tim
李海彬
2018/03/27
2.2K0
【kubernetes系列】master节点部署Pod处于Pending状态
产生问题的原因是master节点部署Pod,导致无法启动; 问题描述: Warning FailedScheduling 40s (x28 over 28m) default-scheduler 0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn’t tolerate.
沁溪源
2022/05/06
3.6K1
【kubernetes系列】master节点部署Pod处于Pending状态
android onresume时view,android – 当对话框出现时不调用OnResume[通俗易懂]
An activity can frequently transition in and out of the
全栈程序员站长
2022/08/31
6690
点击加载更多

相似问题

如何将对象列表转换为简单列表,从对象列表中选择单个属性?

11

如何将对象中的属性列表转换为对象列表

10

将对象列表转换为单个列表

25

将对象列表转换为对象属性列表

21

如何将jq返回的JSON数组转换为具有该列表数据的单个属性的对象?

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文