【问题标题】:UIResponder chain questionUIResponder 链题
【发布时间】:2023-03-24 22:27:01
【问题描述】:

我不太了解修改响应者链的细节,所以如果这是愚蠢的,请不要抨击我;)

基本上我有 2 个视图堆栈(蓝色)作为父视图(红色)的子视图

它们都在某个时间点占据了父级的整个框架,因此显然只有顶部的那个在获取触摸事件,这些事件向上游传播到父视图(红色)并到达窗口。

在某些情况下,我希望触摸输入被“其他”视图堆栈的合格子视图拾取。也就是说,如果当前最顶层视图的 userinteractionenabled 设置为 no,则该视图将接收这些输入。

设置 userinteractionenabled 有效,但我觉得它是一个肮脏的黑客。要点是这个 topmot 视图大部分是透明的,我希望在指定区域被触摸时的事件最终出现在另一个堆栈上。

这是一张帮助直观解释的图片,请记住,两个蓝色视图都是 100% 的父视图。

http://c.crap.ps/35a5

【问题讨论】:

    标签: objective-c cocoa-touch uikit ios uiresponder


    【解决方案1】:

    您可以在每个视图中覆盖 hitTest:withEvent: 以控制谁可以“使用”触摸。

    在您的示例中,我假设绿色区域是您想要使用触摸事件的子视图。如果是这样,那么试试这个 hitTest 方法:

    -(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {  
        UIView *hitView = [super hitTest:point withEvent:event];
        return (hitView == self) ? nil : hitView;
    }
    

    此方法检查触摸是否命中任何子视图。如果是,则让该子视图使用触摸,否则让触摸继续通过层次结构。

    【讨论】:

    • 它们是,但它们对于当前获取事件的视图是未知的。我可以创建对“其他”控制器的引用,该控制器具有我希望触摸事件与之交互的子视图,但我不是完全确定解决此问题的正确方法。
    • 没有必要在彼此中存储视图的引用。您如何以及在何处确定视图何时“有资格”进行触摸?该逻辑应该很容易连接到我提到的hitTest 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多