Skip to content

Latest commit

 

History

History
67 lines (43 loc) · 2.78 KB

iOS事件响应简单综述.md

File metadata and controls

67 lines (43 loc) · 2.78 KB

本文算是一个对iOS中事件响应的一个简单“综述”,方便快速查询相关资料

  • iOS事件有三种
    • 触摸事件(touch events)
    • 加速计事件(motion events)
    • 远程控制事件(remote control events)
  • UIResponder是一个抽象类,只有继承了UIResponse类之后,才能处理上面的事件
  • UIViewUIApplicationUIViewController都是它的子类
  • UIEvent表示一个事件
  • UITouch表示触摸事件中的一个触摸对象(多个手指触摸时就有多个对象)

触摸事件响应过程

注意,这里说的只是触摸事件

  1. 系统产生触摸对象,通过UIApplicationUIWindow等上层对象发出
  2. 通过hitTest过程,找到first responder,确认了事件responder chain(响应链)
  3. 然后两条路一起进行事件响应的处理,在默认情况下
    • 响应链上的手势识别器优先于first responder收到touchBegan等消息,优先判定是否可以识别手势
    • first responder也会收到touchBegan消息
    • 但如果响应链上的手势识别器识别成功了,first responder则会收到touchcancel消息,first responder的响应链也会因此中断
    • 如果手势识别未成功,则不会中断响应链

手势识别器

  • 手势识别器有两种:discrete 和 continuous
  • 两种手势识别器的状态变化不同

系统内置的手势识别器按照类型进行划分如下:

discrete gesture recognizer

  • UITapGestureRecognizer
  • UISwipeGestureRecognizer
  • UIScreenEdgePanGestureRecognizer

continuous gesture recognizer

  • UIPanGestureRecognizer
  • UIRotationGestureRecognizer
  • UIPinchGestureRecognizer

state of discrete gesture recognizer

state of discrete gesture recognizer

state of continuous gesture recognizer

一点心得

关于responder chain与gesture recognizer之间的协同工作原理,官方并没有详细说明,目前网上的文章主要是以代码测试结果为依据。这里强烈推荐参考文章中的第一篇

所以

可能实际项目中仍会遇到一些很难解的问题

未解难题

  1. 向tableview中添加一个自定义view,view.userInteractionEnable = YES;此时,被view遮盖住的cell,无法点击,但是在view区域拖动,tableview却可以跟随滚动。为什么?

参考