Я работаю над приложением для iphone (iOS 4.0 или новее) и у меня проблемы с сенсорным управлением между несколькими представлениями. У меня есть такая структура представления
---> A superView
|
---> SubView - A
|
---> SubView - B (exactly on top of A, completely blocking A).
В основном у меня есть суперпредставление, и одноуровневые подпредставления A и B. B имеют тот же фрейм, что и A, поэтому 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
отменяет только конкретное событие касания, а не пересылает его.
Есть ли другой способ выполнить мое требование? Я готов работать над любой подсказкой, которую вы дадите.
Мой так называемый subView A на самом деле является экземпляром класса View сторонней библиотеки, который убирает все прикосновения, и я не могу контролировать какие-либо жесты на нем. Мне нужна другая реализация для смахивания влево и вправо, и я хочу, чтобы щипки, касания и т. Д. Работали так же, как это работает с этим сторонним представлением. Поэтому я поместил представление поверх A (SubView B), чтобы получить свайпы влево и вправо. Но теперь я хочу перенаправить другие события жестов в базовую библиотеку.