У меня есть куча UIViews, как на картинке ниже.Красный / розовый (полупрозрачный) вид сверху других.
- Красный имеет
UISwipeGestureRecognizer
. - Зеленый имеет
UITapGestureRecognizer
. - Синий не имеет распознавателя.
Нажмите на видимая (нижняя левая) часть зеленого вызывает его распознаватель.
касание скрытых частей зеленого не вызывает его распознаватель (красные блокиЭто).
Вот в чем проблема: я хочу, чтобы Грин сработал.Как я могу это сделать?
На практике представления могут быть в любом порядке, в любом количестве и быть подпредставлениями друг друга и т. Д. Но проблема та же:
Какмогу ли я надежно найти самый верхний вид, который может обрабатывать жест (касание или пролистывание)?
Я пробовал с кодом ниже.Он аккуратно пересекает все виды, но терпит неудачу, так как не может знать, является ли событие частью пролистывания или касания.Таким образом, метод всегда возвращает красный вид.Если я удаляю свайп-распознаватель из красного, код работает правильно.
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView == self)
{
if (self.hasASwipeRecognizer)
return self; // What if this was a tap?
if (self.hasATapRecognizer)
return self;
else
return nil;
}
else
return hitView;
}