为什么hitTest:withEvent:每次触摸调用三次?

Jam*_*ton 14 cocoa-touch event-handling ios

我有一个子类UIView,我已经覆盖hitTest:withEvent:了如下:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    NSLog(@"Event = %@", event);
    return self;
}
Run Code Online (Sandbox Code Playgroud)

对于视图中的每次触摸,我看到三次调用hitTest:withEvent:.这三个电话是在修饰之前进行的.输出如下:

2011-07-01 09:20:58.553 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4297.16 touches: {(
)}
2011-07-01 09:20:58.553 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4297.16 touches: {(
)}
2011-07-01 09:20:58.554 AppName[930:207] Event = <UITouchesEvent: 0x6a08360> timestamp: 4304.54 touches: {(
)}
Run Code Online (Sandbox Code Playgroud)

根据时间戳和地址,似乎UITouchesEvent正在使用单个对象,并且在第三次调用之前未正确设置其时间戳.任何人都可以解释为什么这样hitTest:withEvent:被叫三次?我不是在寻找一种解决方法.我只是想了解发生了什么.

小智 6

我有同样的问题,并能够使用此代码解决它.即使pointInside和hitTest被调用3次,触摸的UIView的touchesBegan(或touchesEnded)也会被调用一次.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{   
    if (event.type == UIEventTypeTouches)
        NSLog(@"%@", self);
}


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if ([self pointInside:point withEvent:event])
        return self;

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

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint([self bounds], point))
    {
        if (event.type == UIEventTypeTouches)
        {           
            return YES;
        }
    }

    return NO;
}
Run Code Online (Sandbox Code Playgroud)


crg*_*rgt 4

您是否有多个子视图?

\n\n

来自文档:

\n\n

该方法通过向每个子视图发送 pointInside:withEvent: 消息来遍历视图层次结构结构,以确定哪个子视图应该接收触摸事件。如果pointInside:withEvent:返回YES,则遍历subview\xe2\x80\x99s层次结构;否则,视图层次结构的分支将被忽略。您很少需要自己调用此方法,但您可以重写它以隐藏子视图中的触摸事件。

\n