UIButton如何处理触摸事件并将其传递?

3

是否可以处理触摸UIButton事件并将其传递给下一个响应者?

1个回答

2

编辑

另一种有效的方法是重写UIResponder类的touchesEnded:withEvent:方法。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // handle touch
    [super touchesEnded:touches withEvent:event];
} 

文档中:

该方法的默认实现什么也不做。但是,UIResponder 的直接 UIKit 子类,特别是 UIView,会将消息转发到响应者链上。 要将消息转发给下一个响应者,请将消息发送给 super(超类实现);不要直接将消息发送给下一个响应者。


原始答案

为了确定视图层次结构中哪个UIView应该接收触摸,使用方法-[UIView hitTest:withEvent:]。根据文档

此方法通过调用每个子视图的pointInside:withEvent:方法来遍历视图层次结构,以确定哪个子视图应该接收触摸事件。如果pointInside:withEvent:返回YES,则类似地遍历子视图的层次结构,直到找到包含指定点的最前面的视图。如果一个视图不包含该点,则忽略其视图层次结构的分支。

因此,一种方法是创建一个UIButton子类并覆盖方法-pointInside:withEvent:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if (CGRectContainsPoint(self.bounds, point) {
        // The touch is within the button's bounds
    }
    return NO;
}

这将使您有机会在按钮范围内处理触摸,但同时返回NO将使命中测试失败,并将触摸沿视图层次结构传递。

从理论上讲,我同意这并不是最完美的设计,但是点击测试机制是为了检索单个视图以处理触摸而设计的。你在某种程度上改变了设计,因此可能会出现一些小问题。然而,如果您可以提供有关您的要求的额外细节,这可能有助于找到替代解决方案。 - Gabriele Petronella
是的,我正要在苹果文档中阅读那段话 :) 谢谢,这种方法好多了。 - Nik
很遗憾,第一种方法对于这种情况不起作用,我认为他们并不是指“传播”而是“通过下方”。 - Nik
你尝试过同时实现touchesEndedtouchesBegan吗? - Gabriele Petronella
是的,我实现了所有touches*组的方法。 - Nik
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接