Я пытаюсь создать наложенный вид, который отслеживает касания, а затем исчезает, а также перенаправляет события касания в то, что находится под видом.
Мое тестовое приложение имеет вид с кнопкой внутри. Я добавляю представление наложения в качестве другого подпредставления (по сути, брат и сестра), которое занимает весь экран.
Для обоих решений, которые я пробовал, наложение сохраняет состояние, чтобы определить, как оно реагирует на прикосновение. При получении события 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 = /