【问题标题】:touchesBegan method not called when added as subview of another view添加为另一个视图的子视图时未调用 touchesBegan 方法
【发布时间】:2016-06-16 00:40:50
【问题描述】:

晚上好。 我有两个 ViewController(让我们将它们命名为 A 和 B),都覆盖了 touchesBegan 方法。它是这样工作的:当视图 A 被点击时,B 的视图被添加为 A 的视图的子视图,并且中心位于触摸位置。但是当我在 B 的视图中点击(最近添加)时,不会调用 B 的 touchesBegan。我已经在两个视图中都将 view.enableUserInteraction 设置为 true,并且已经对 nextResponder().touchesBegan 方法进行了失败的测试。我究竟做错了什么 ? Obs:我打算添加 B 的几个视图(宽度=60,高度=60)作为 A 的视图的子视图。

【问题讨论】:

    标签: ios swift uiviewcontroller


    【解决方案1】:

    这是因为触摸事件是由 A 响应的。您应该在 B 显示时关闭 A 的用户交互。

    更新:
    试试这个:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (!self.clipsToBounds && !self.hidden && self.alpha > 0.01) {
            for (UIView *subview in self.subviews.reverseObjectEnumerator) {
                CGPoint subPoint = [subview convertPoint:point fromView:self];
                UIView *result = [subview hitTest:subPoint withEvent:event];
                if (result != nil) {
                    return result;
                }
            }
        }
    
        return nil;
    }
    

    【讨论】:

    • 但我必须添加几个 B(宽度 = 60 和高度 = 60)。如果我关闭 A,以后如何添加另一个 B?
    • @BrunoBarros 我很喜欢。您应该覆盖 A 视图的hitTest。当你发现一个子视图被点击时,你应该传递那个事件。
    • 很好..你能帮我看看怎么做吗?如果您能用一些代码回答,我将不胜感激。 tks
    • @BrunoBarros 更新了我的答案。
    • 但是当我将 B 的视图添加为 A 的视图的子视图时,B 的视图位于 A 的视图之上。理论上,B 应该通过 touchesBegan 而不是视图的视图来接收触摸A. 我说的对吗?
    【解决方案2】:

    你有两个视图还是两个视图控制器?当您触发加载视图“B”的事件时,请在视图对象上调用 .becomeFirstResponder()

    【讨论】:

    • 两个 viewControllers 和它们各自的视图
    • 您可能需要将手势识别器添加到您的第二个视图,以便它可以处理点击。 let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector() view.addGestureRecognizer(tap) 然后在选择器中触发您需要的任何方法。
    • 是的..我已经这样做了,而且效果很好。但我只是想知道为什么 touchesBegan 不起作用。但是顺便说一句
    • 我实际上找到了一篇很棒的文章,描述了 Lumailxk 正在谈论的内容,但没有足够的代表评论。如果您想阅读link,请点击此处的链接。每天学习新东西。
    • tks,@Haligen..我读了这篇文章,仍然很困惑。文章说返回的命中测试视图(在我的情况下它将是 B,因为它覆盖了 A 的视图)处理该事件。但是 A 正在处理事件(我仍然不知道为什么)。如果我在 B 视图中添加点击手势,它可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多