Переиздание сенсорного события - PullRequest
1 голос
/ 23 июля 2011

Я пытаюсь создать наложенный вид, который отслеживает касания, а затем исчезает, а также перенаправляет события касания в то, что находится под видом.

Мое тестовое приложение имеет вид с кнопкой внутри. Я добавляю представление наложения в качестве другого подпредставления (по сути, брат и сестра), которое занимает весь экран.

Для обоих решений, которые я пробовал, наложение сохраняет состояние, чтобы определить, как оно реагирует на прикосновение. При получении события touchesBegan наложение перестанет отвечать на hitTest или pointInside, пока не получит touchesCancelled или touchesEnded.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if(_respondToTouch)
    {
        NSLog(@"Responding to hit test");
        return [super hitTest:point withEvent:event];
    }
    NSLog(@"Ignoring hit test");
    return nil;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if(_respondToTouch)
    {
        NSLog(@"Responding to point inside");
        return [super pointInside:point withEvent:event];
    }
    NSLog(@"Ignoring point inside");
    return NO;
}

Для моего первого подхода я попытался повторно выпустить событие:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!_respondToTouch)
    {
        NSLog(@"Ignoring touches began");
        return;
    }
    NSLog(@"Responding to touches began");
    _respondToTouch = NO;

    [[UIApplication sharedApplication] sendEvent:event];
}

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches cancelled");
    _respondToTouch = YES;
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches ended");
    _respondToTouch = YES;
}

Однако кнопка не ответила на переизданное событие.

Мой второй подход состоял в том, чтобы использовать hitTest, чтобы обнаружить представление (мою кнопку) под оверлеем, а затем отправить ему сообщение touchesXXX непосредственно:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches began");
    _respondToTouch = NO;
    UITouch* touch = [touches anyObject];
    _touchDelegate = [[UIApplication sharedApplication].keyWindow hitTest:[touch locationInView:self.superview] withEvent:event];
    CGPoint locationInView = [touch locationInView:_touchDelegate];
    NSLog(@"Sending touch %@ to view %@. location in view = %f, %f", touch, _touchDelegate, locationInView.x, locationInView.y);
    [_touchDelegate touchesBegan:touches withEvent:event];
}

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches cancelled");
    [_touchDelegate touchesCancelled:touches withEvent:event];
    _respondToTouch = YES;
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches ended");
    [_touchDelegate touchesEnded:touches withEvent:event];
    _respondToTouch = YES;
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches moved");
    [_touchDelegate touchesMoved:touches withEvent:event];
}

Она находит кнопку (согласно журналам), но кнопка вообще не реагирует, когда я вызываю на нее прикосновения. ХХХ.

Я не уверен, что еще попробовать, так как кнопка не будет реагировать на прямой вызов touchesBegan = /

...