Перенаправление UIGesture на представления позади

Я работаю над приложением для iphone (iOS 4.0 или новее) и у меня проблемы с сенсорным управлением между несколькими представлениями. У меня есть такая структура представления

---> A superView 
     |
     ---> SubView - A 
     |
     ---> SubView - B (exactly on top of A, completely blocking A).

enter image description here

В основном у меня есть суперпредставление, и одноуровневые подпредставления A и B. B имеют тот же фрейм, что и A, поэтому A полностью скрывается.

Теперь мое требование таково.

  1. SubView B должен получать все смахивания и касания (одинарные и двойные) жесты.
  2. Подвид A должен получать все жесты сжатия.

Вот как я добавил распознаватели жестов к представлениям

UISwipeGestureRecognizer *leftSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate  =   self;
[bView addGestureRecognizer:leftSwipe];
[leftSwipe release];

UISwipeGestureRecognizer *rightSwipe  =  [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate   =   self;
[bView addGestureRecognizer:rightSwipe];
[rightSwipe release];

UIPinchGestureRecognizer *pinch   =  [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate    =   self;
[aView addGestureRecognizer:pinch];
[pinch release];

Я провел небольшое исследование, и для меня UIGestureRecognizerDelegate выглядел многообещающим, и я реализовал метод делегирования

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

Я вернул NO для SubView B, надеясь, что базовое представление получит это событие. Однако нет такой удачи

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
        NSLog(@"pinchGesture");
        //bView.userInteractionEnabled = NO;
        return NO;
    }
    return YES;
}

Затем я отключил взаимодействие пользователя с SubView B внутри обратного вызова делегата (закомментированный код в приведенном выше блоке), когда распознается жест сжатия, надеясь, что оставшаяся часть жеста будет получена SubView A. Не повезло и там. ..

Вот где я сейчас стою. Я видел этот вопрос, где принятый ответ включает свойство cancelsTouchesInView . Но я считаю, что cancelsTouchesInView отменяет только конкретное событие касания, а не пересылает его.

Есть ли другой способ выполнить мое требование? Я готов работать над любой подсказкой, которую вы дадите.

РЕДАКТИРОВАТЬ: BOUNTY TIME

Мой так называемый subView A на самом деле является экземпляром класса View сторонней библиотеки, который убирает все прикосновения, и я не могу контролировать какие-либо жесты на нем. Мне нужна другая реализация для смахивания влево и вправо, и я хочу, чтобы щипки, касания и т. Д. Работали так же, как это работает с этим сторонним представлением. Поэтому я поместил представление поверх A (SubView B), чтобы получить свайпы влево и вправо. Но теперь я хочу перенаправить другие события жестов в базовую библиотеку.

57
задан Community 23 May 2017 в 12:17
поделиться