【问题标题】:Why is hitTest not being called when views subview is touched?为什么在触摸视图子视图时不调用 hitTest?
【发布时间】:2013-03-17 21:36:10
【问题描述】:

我有一个名为parentView 的视图,它有一个名为childView 的子视图。 childView 的一部分在parentView 的范围之外,childView 附加了一个panGestureRecognizer。我在parentView 中实现了以下内容,以便它能够识别对childView 的触摸,即使它超出了它的超级视图范围:

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

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

然而,当我触摸或拖动childView 时,hitTest 甚至不会在parentView 上被调用。这是为什么呢?

【问题讨论】:

    标签: iphone ios cocoa-touch uiview hittest


    【解决方案1】:

    因为事件沿着响应者链传递,并在调用 hittest 之前使用

    所以在这种情况下,事件是从上到下的......查看有关响应者链的文档:

    虽然不是很清楚 :D http://developer.apple.com/library/ios/#DOCUMENTATION/EventHandling/Conceptual/EventHandlingiPhoneOS/Introduction/Introduction.html

    但重要的一点:

    • hit-test 视图第一次有机会处理触摸事件。如果命中测试视图无法处理事件,则事件会沿着该视图的响应者链向上传播,如“响应者链由响应者对象组成”中所述,直到系统找到可以处理它的对象。

    • 触摸事件。如果命中测试视图无法处理触摸事件,则事件会向上传递以命中测试视图开头的响应链。

    【讨论】:

    • 这个问题的答案仍然是 100% 有效的,而且机制没有改变,我认为它永远不会改变——你指向退休文档的事实并没有改变它;)
    • 您的链接显示“本文档可能不代表当前开发的最佳实践”——可能:D——链到底有什么无效的?显然这是给 UIKit 的
    • 我从未声称这不是真的。真的是。我只是提供了一个资源链接,因为另一个只是将您重定向到 Apple 的标准“UIKit”站点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多