ios - 通过兄弟 subview 传播触摸事件?

标签 ios objective-c touch uitouch

我有一堆 subview ,它们都有用户交互部分(子部分)并且全屏显示。问题是,如果我触及堆栈顶部的非交互式部分,它就不会将该触摸传播到堆栈的其余部分。我的设置:

View A --view B(全屏容器,本身不是交互式的但有交互式 subview ) ----查看B1(交互式) ---- View B2(交互式) -- View C(与B相同) ----查看C1(交互式) ----查看C2(交互式)

B 和 C 都是全屏,但 B1/B2/C1/C2 只是屏幕的一小部分。

[a addSubview:b];
[a addSubview:c];

如果我触摸 C1/C2 之外的任何东西,我希望触摸事件检查它是否触及 B (B1/B2) 内部的任何地方,但它只是返回到 A,然后返回到 A 的父级.是否有可能做到这一点?如果我在 C 上将 userInteractionEnabled 设置为 NO 但在 C1/C2 上设置为 YES,它也不会收到任何对内部调用的调用,尽管在这种情况下 B 会按预期进行接触。

编辑:结束手动遍历 View 堆栈以仅检查某些 subview 而不是所有 subview :

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    if (self != self.topCustomViewsContainer) {     
        for (UIView *v in self.createdSubviews) {
            CGPoint newPoint = point;
            newPoint.x -= v.frame.origin.x;
            newPoint.y -= v.frame.origin.y;
            UIView *hit = [v hitTest:newPoint withEvent:event];
            if (hit)
                return hit;
        }
        return nil;

    }

    return [super hitTest:point withEvent:event];
}

最佳答案

一种可能是覆盖

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

View B 中的方法。只有当 B 的 subview 被命中时,您才能让它返回。像这样尝试:

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

关于ios - 通过兄弟 subview 传播触摸事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067865/

相关文章:

ios - "The developer buy flow has been deprecated"

ios - 当应用程序处于后台时,如何检测特定时间何时过去?

ios - NSURLComponents elementsWithString - 规则

android - android 使用软键盘打字时的 touchEvent

ios - 无效的 .pkg 文件

ios - 对齐 Collection View 单元格以适合每行 3 个

ios - UIViewcontroller 不会旋转

iphone - 我可以为 iCloud 添加不备份 "Document Directory"吗

c# - Windows 窗体应用程序中的触摸手势中的触摸位置未正确更新

android - Gallery 内的 ScrollView 内的按钮不响应点击