前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS_Responder chain 响应链

iOS_Responder chain 响应链

作者头像
mikimo
发布2022-10-28 10:48:07
3060
发布2022-10-28 10:48:07
举报
文章被收录于专栏:iOS开发~

iOS Responder chain

前言

iOS中所有继承自UIResponder的类的实例, 都是可以响应touch事件的对象. 响应机制分为传递链响应链.

传递链: 由系统向离用户最近的view传递: UIApplication -> UIWindow -> RootViewController -> View -> ... -> Button

响应链: 由离用户最近的view向系统响应: Button -> View -> ... -> RootViewController -> UIWindow -> UIApplication


事件的传递及响应过程, 如图:

向右指的箭头为传递链, 向左指的箭头为响应链.


Hit-Test机制: (寻找响应者)

  1. 当发生touch后, 系统会将touchUIEvent的方式, 加入到UIApplication管理的事件任务队列中(FIFO)
  2. UIApplication将出入任务队列最前端的事件向下传递, 传递给UIWindow
  3. UIWindow将事件向下传递给RootVC
  4. RootVC将事件向下传递给View
  5. 调用ViewhitTest方法, 判断当前View是否可响应事件, 再调用pointInside判断触摸点是否在自己身上,如果都满足就逆序遍历subViews, 调用其hitTest方法
  6. subViews中有返回对象的, 则表示该对象为事件的响应者(子视图返回非空对象)
  7. subViews中都没有返回对象, 则该view及为时间的响应者(子视图遍历完毕)

Hit-Test方法伪实现如下:

代码语言:javascript
复制
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    print("hitTest: \(self)")
    /// 1. 判断当前view是否可响应
    guard isUserInteractionEnabled else {
        /// 不允许用户交互
        return nil
    }
    guard !isHidden else {
        /// 已隐藏
        return nil
    }
    guard alpha > 0.01 else {
        /// 不透明度小于等于 0.01
        return nil
    }
    
    /// 2. touch的坐标是否在view的frame内
    guard self.point(inside: point, with: event) else {
        return nil
    }

    /// 3. 倒序遍历子视图, 递归调用hitTest
    for subview in subviews.reversed() {
        let subPoint = self.convert(point, to: subview)
        /// 首个非空子视图, 即为 first responder
        if let fitView = subview.hitTest(subPoint, with: event) {
            return fitView
        }
    }
    /// 4. 遍历所有的子视图都没有响应 hit-testing, 则该view为 first responder
    return self
}

GitHub Demo

参考: Using responders and the responder chain to handle events

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • iOS Responder chain
  • 前言
  • 事件的传递及响应过程, 如图:
  • Hit-Test机制: (寻找响应者)
  • Hit-Test方法伪实现如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档