Ios 第一响应者和HIT测试方法之间有什么关系?

Ios 第一响应者和HIT测试方法之间有什么关系?,ios,swift,objective-c,first-responder,Ios,Swift,Objective C,First Responder,我理解系统find视图是如何通过调用视图及其子视图上的以下方法来处理触摸事件的 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; 但我不明白第一反应者在这个机制中的作用 firstResponder是否代表hitTest遍历的起点?它们之间没有太多关系,只是hit test的结果可能会导致窗口使

我理解系统find视图是如何通过调用视图及其子视图上的以下方法来处理触摸事件的

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
但我不明白第一反应者在这个机制中的作用


firstResponder是否代表hitTest遍历的起点?

它们之间没有太多关系,只是hit test的结果可能会导致窗口使hit view变成
firstResponder

firstResponder
是关于键盘事件的,至少在macOS上是关于菜单项操作和命令的,如
cut
copy
paste
undo

当应用程序从窗口服务器接收到键盘事件时,它将转到
第一响应程序
。如果它对它不感兴趣,那么它会沿着链向上移动到
nextResponder
,直到耗尽响应器链。在macOS上,有相关但独立的
mainWindow
keyWindow
概念。它们通常是相同的,但可以不同。如果它们不同,则响应器链首先从
键窗口开始,当该链用完时,它会转到
主窗口。然后,应用程序就有了漏洞。然后是应用程序的委托。然后,如果它是基于文档的应用程序,则该文档和该文档的委托

在iOS上,我对确切的细节有点模糊,但它是相似的。事实上,我认为它更简单,因为你没有多个窗口


另一方面,命中测试是关于视图继承权的。因此,应用程序会找到命中发生在哪个窗口(在macOS上),然后从该窗口向下移动到它的直接子视图,然后再向下移动它的子视图,等等。。。直到找到被点击的叶子视图。

我建议您完整阅读第一篇文章

在Apple文档中

简短答复:

  • 触摸事件直接发送给第一响应者
  • 当应用程序接收到事件时,UIKit会自动将该事件定向到最合适的响应程序对象,称为first responder

  • 第一响应者由命中测试确定
  • UIKit使用基于视图的点击测试来确定触摸事件发生的位置。具体而言,UIKit将触摸位置与视图层次中视图对象的边界进行比较。UIView的hitTest(:with:)方法遍历视图层次结构,查找包含指定触摸的最深子视图,,该子视图成为触摸事件的第一响应者

  • 如果第一个响应者不处理事件,则事件将从响应者传递到活动响应者链中的响应者

  • 据我所知,如果UIView控件被命中,它将成为第一响应者。就这样。谢谢你,伙计,我已经看过文件了,但是仍然让我困惑的是1。触摸事件首先传递给AppDelegate,然后通过递归使用HitTest和PointInside一直传递到屏幕上最上面的视图,对吗?之后,最上面的视图将是第一个响应者。但是第一个链接文档中的图表显示了流程从视图开始。系统如何找到这些视图。链中何时使用
    next
    (next responder)属性?我在一个演示项目中检查过,将根视图控制器的
    next
    设置为nil不会影响UIKit来查找我接触的视图。从第一个链接文档中,“您可以通过覆盖响应器对象的next属性来更改响应器链。当您这样做时,下一个响应器就是您返回的对象。”触摸事件首先发送给第一响应者,而不是应用程序代表。通常,第一响应者是屏幕上最深(最前面)的子视图。1。发生触摸事件。2.从下到上点击测试3。第一响应者已确定。4.如果它不处理触摸,事件将传递给下一个响应器5。默认情况下,下一个响应程序从上到下是它的超级视图、关联的视图控制器、窗口或应用程序。