当我们在屏幕上做了一个点击操作(事件),系统会将该事件传给由UIApplication管理的一个事件队列中,UIApplication会将事件队列中最前面的一个事件传递给程序的主窗口(key window),主窗口会自动调用下面的方法:
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
这个方法返回的view为处理事件最合适的view。
当事件传递给主窗口之后,这个事件会从父视图一层层传递给子视图:如果父视图中没有子视图或者子视图不能响应事件(isUserInteractionEnabled == false),则父视图为处理事件最合适的view,否则继续将事件传递给子视图。
当子视图超出了父视图时,超出部分是不能响应事件的,原因是触摸点不在父视图中,所以无法正确返回子视图作为处理事件合适的view。所以我们就需要在父视图中重写hitTest方法,返回子视图:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView<