iOS Touch message 传递图解

  1. 系统会通过hitTest的方法寻找响应链,完成之后会形成上图模型。

  2. 有了模型之后就会发生图上的三个步骤
    第一步:系统会将所有的 Touch message 优先发送给 关联在响应链上的全部手势。手势根据Touch序列消息和手势基本规则更改自己的状态(有的可能失败,有的可能识别等等)。如果没有一个手势对Touch message 进行拦截(拦截:系统不会将Touch message 发送给响应链顶部响应者),系统会进入第二步
    第二步:系统将Touch message 发送给响应链 顶部的 视图控件,顶部视图控件这个时候就会调用Touch相关的四个方法中的某一个。之后进入自定义Touch message转发
    第三步:自定义Touch message转发可以继承UIResponser的四个Touch函数做转发。

举例说明

aView 有一个子视图 bView ,aView 有 一个Tap手势。
点击bView,
bView 将收到 touchesBegan
然后aView 手势Tap手势识别成功,执行手势
然后 bView 收到 touchesCancelled

经过我的测试,如果bView 是UIButton(或其他能响应事件的控件) 则不同,早期版本的UIButton 和UIView 一样,点击操作会失效。只会收到touchesBegan touchesCancelled
高版本的iOS系统中,UIButton 内部估计也是使用手势,不会被其他手势截断 (猜测)

最近的文章

单向数据流动的函数式 View Controller

转载自: https://onevcat.com/2017/07/state-based-viewcontroller/ View Controller 向来是 MVC (Model-View-View Controller) 中最让人头疼的一环,MVC 架构本身并不复杂,但开发者很容易将大量代码扔到用于协调 View 和 Model 的 Controller 中。你不能说这是一种错误,因为 View Controller 所承担的本来就是胶水代码和业务逻辑的部分。但是,持续这样做...…

继续阅读
更早的文章

Kingfisher 3 源码全解读笔记

个人笔记,不适合阅读Kingfisher.swift泛型Base接受任何类型,实例化Kingfisher后将Base的实例保存在 base字段里,public final class Kingfisher<Base> { public let base: Base public init(_ base: Base) { self.base = base }}kf字段用于获取对象的 Kingfisher 实例对象,用来调用一些Kingfisher提...…

继续阅读