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