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