objective-c - UIResponder 链题

标签 objective-c cocoa-touch uikit ios uiresponder

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

基本上我有 2 个 View 堆栈(蓝色)作为父 View (红色)的 subview

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

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

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

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

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

最佳答案

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

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

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

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

关于objective-c - UIResponder 链题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090769/

相关文章:

iOS 应用程序 - 如何从应用程序商店获取数据?

ios - 如何在当前队列中dispatch_after?

iphone - UIDeviceOrientation 横向模式下未知

ios - 在iOS中绘制可变宽度的路径

iphone - UITableView insertSections : withRowAnimation: causing all table cells to be requested

objective-c - 没有从 Core Data 获取数据

objective-c - 如何检查对象是否为零

iphone - 如何在调整 UIView 大小时设置动画

ios - 关于iOS 14导航栈管理的问题(不同于iOS 13)

objective-c - 在运行时向类添加 Objective-C 方法