我的问题:我有一个超级视图 EditView
,它基本上占据整个应用程序框架,以及一个子视图 MenuView
,它只占据底部约20%的区域,然后 MenuView
包含自己的子视图 ButtonView
,它实际上位于 MenuView
的边界外(类似于这样:ButtonView.frame.origin.y = -100
)。
(注意: EditView
有其他不属于 MenuView
的视图层次结构的子视图,但可能会影响答案。)
您可能已经知道了问题所在:当 ButtonView
处于 MenuView
边界内时(更具体地说,当我的触摸在 MenuView
的边界内时),ButtonView
响应触摸事件。当我的触摸在 MenuView
的边界之外(但仍在 ButtonView
的边界内)时,ButtonView
不会接收到触摸事件。
示例:
- (E)是所有视图的父视图
EditView
- (M)是
MenuView
,它是EditView
的子视图 - (B)是
ButtonView
,它是MenuView
的子视图
图示:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
因为 (B) 区域位于 (M) 的框架之外,所以在该情况下,触摸 (B) 区域的操作不会被发送到 (M),事实上,(M) 没有分析这种情况下的触摸事件,而是将其发送到层级结构中的下一个对象。目标:我了解到可以通过覆盖 hitTest:withEvent: 来解决此问题,但我不太明白具体如何操作。 在我的情况下,应该在 EditView(我的“主”父视图)中覆盖 hitTest:withEvent: 吗?还是应该在 MenuView 中覆盖它,即未接收到触摸的按钮的直接父视图?或者我对此的想法是错误的?
如果需要详细说明,请提供一个好的在线资源 - 除了苹果的UIView文档,因为这些文档没有让我清楚地了解到这件事。
谢谢!
return
语句后面加上break
语句,因为它永远不会被执行。除此之外,答案非常好。 - datwelkreturn
应该是self
,不是吗?否则,对视图本身的触摸将被忽略。如果我错了,请纠正我。 - Yevhen Dubinin