问题描述
虽然大多数苹果文档都写得很好,但我认为 'iOS 事件处理指南' 是一个例外.我很难清楚地理解那里描述的内容.
While most apple documents are very well written, I think 'Event Handling Guide for iOS' is an exception. It's hard for me to clearly understand what's been described there.
文件说,
在命中测试中,一个窗口在视图层次结构的最顶层视图上调用hitTest:withEvent:
;此方法通过在视图层次结构中返回 YES 的每个视图上递归调用 pointInside:withEvent:
继续进行,向下进行层次结构,直到找到发生触摸的边界内的子视图.该视图成为命中测试视图.
那么是不是系统只调用了最顶层视图的hitTest:withEvent:
,它调用了所有子视图的pointInside:withEvent:
,如果特定子视图的返回值为 YES,则调用该子视图的子类的 pointInside:withEvent:
?
So is it like that only hitTest:withEvent:
of the top-most view is called by the system, which calls pointInside:withEvent:
of all of subviews, and if the return from a specific subview is YES, then calls pointInside:withEvent:
of that subview's subclasses?
推荐答案
这似乎是一个很基本的问题.但我同意你的意见,该文件不像其他文件那样清晰,所以这是我的回答.
It seems quite a basic question. But I agree with you the document is not as clear as other documents, so here is my answer.
hitTest:withEvent:
在 UIResponder 中的实现如下:
The implementation of hitTest:withEvent:
in UIResponder does the following:
- 它调用了
self
的 - 如果返回 NO,
hitTest:withEvent:
返回nil
.故事的结局. - 如果返回是 YES,它会发送
hitTest:withEvent:
消息到它的子视图.它从顶级子视图开始,并继续到其他视图,直到一个子视图返回一个非nil
对象,否则所有子视图都会收到消息. - 如果子视图第一次返回一个非
nil
对象,第一个hitTest:withEvent:
返回那个对象.故事的结局. - 如果没有子视图返回非
nil
对象,第一个hitTest:withEvent:
返回self
pointInside:withEvent:
- It calls
pointInside:withEvent:
ofself
- If the return is NO,
hitTest:withEvent:
returnsnil
. the end of the story. - If the return is YES, it sends
hitTest:withEvent:
messages to its subviews.it starts from the top-level subview, and continues to other views until a subviewreturns a non-nil
object, or all subviews receive the message. - If a subview returns a non-
nil
object in the first time, the firsthitTest:withEvent:
returns that object. the end of the story. - If no subview returns a non-
nil
object, the firsthitTest:withEvent:
returnsself
这个过程会递归重复,所以通常最终会返回视图层次结构的叶子视图.
This process repeats recursively, so normally the leaf view of the view hierarchy is returned eventually.
但是,您可以覆盖 hitTest:withEvent
以做不同的事情.在许多情况下,覆盖 pointInside:withEvent:
更简单,并且仍然提供足够的选项来调整应用程序中的事件处理.
However, you might override hitTest:withEvent
to do something differently. In many cases, overriding pointInside:withEvent:
is simpler and still provides enough options to tweak event handling in your application.
这篇关于iOS 的事件处理 - hitTest:withEvent: 和 pointInside:withEvent: 是如何相关的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!