我有一个有点复杂的视图层次结构。我遇到的问题是我有几个兄弟视图,这些视图可以在屏幕上移动。每当移动视图时,我的代码都会对子视图进行重新排序,以便它在视觉上位于所有其他兄弟姐妹之上。
我的问题是,当一个视图在视觉上位于另一个视图之上时,它下面的视图实际上首先接收到触摸。有谁知道什么会导致这样的行为?也许有人遇到过类似的问题。
提前致谢,
我有一个有点复杂的视图层次结构。我遇到的问题是我有几个兄弟视图,这些视图可以在屏幕上移动。每当移动视图时,我的代码都会对子视图进行重新排序,以便它在视觉上位于所有其他兄弟姐妹之上。
我的问题是,当一个视图在视觉上位于另一个视图之上时,它下面的视图实际上首先接收到触摸。有谁知道什么会导致这样的行为?也许有人遇到过类似的问题。
提前致谢,
我的理解是hitTest
,这些视图的超级视图只是简单地遍历其subviews
数组并选择第一个以非响应的nil
。首先绘制列表中较早排序的视图subviews
,这意味着它们将在视觉上位于其他视图下方。
好的,我刚刚发现了问题,所以我会回答我自己的问题,以防其他人偶然发现这个问题。
这里的问题原来出在我的一个超级视图中,这些兄弟姐妹就坐在其中。这个超级视图覆盖了 hitTest: 方法并以正向循环遍历它的子视图。Apple 明确声明 hitTest: 方法应该以相反的顺序循环遍历其子视图。所以更新循环以相反的顺序解决了这个问题。
逆序的原因很简单。每次添加子视图时,都会将其添加到子视图数组的末尾,并在视觉上放置在所有其他子视图的顶部。所以屏幕上最前面的视图是子视图数组中的最后一个视图,这就是为什么你需要以相反的顺序进行。
希望这可以帮助任何偶然发现这种行为的人。
如果您更改视图层的 zPosition,则可能会发生这种情况。