2013-03-12 5 views
0

У меня есть набор UIViews, которые наложены друг на друг, как это:Как ограничить UIGestureRecognizer определенным UIView?

  • UIWindow
  • UIViewController
  • UIView (охватывает все окно; тег: 41)
  • UIView (тэг: 100 (покрывает верхние половина UIView (тэг: 41))
  • UIScrollView (в нижней части; тег: 126)
  • UIView (охватывает UIScrollView; тег: 21)
  • UIView (тег: 22) < ----- охватывает часть тега-21 UIView

Верхний UIView (Тэг: 22) является единственным UIView, что я хочу краны, которые будут признаны за. Используя NSLog, тег всегда ссылается на тег: 41.

Вот мой код в ViewController (-viewDidLoad метод):

// Create and initialize a tap gesture 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
tap.numberOfTapsRequired = 1; 
tap.numberOfTouchesRequired = 1; 
[self.view addGestureRecognizer:tap]; 

Это код, который обрабатывает кран (также помещен в VC)

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer { 

CGPoint pt = [gestureRecognizer locationInView:self.view]; 

UIView *v = [self.view hitTest:pt withEvent:nil]; 
NSLog(@"\n\nx: %ld\ny: %ld\ntag: %d",(long)pt.x, (long)pt.y, self.view.tag); 

if ([v isKindOfClass:[SubViewData class]]) { 
    NSLog(@"SubViewData!"); 
    return; 
} 

}

Чтение руководства по обработке событий (стр. 32) Я вижу, что первое представление, которое попадает под ограничения области прослушивания, является тем, которое получает привет t-test, который в этом случае будет тегом: 41. Мне нужно тег: 22, чтобы получить тест удар, потому что есть еще один UIView (тег: 100), сидя на верхней части тега: 41, который также признает, кран ...

ОБНОВЛЕНО: Я добавил код для обработки кранов ... есть ли способ, который я могу программно отклонить краны, если это не для UIVIew тега: 22?

+0

К которому Вы добавили распознаватель жестов? –

+0

Добавлено в viewController для тега: 41 ... тег: 22 не имел собственного VC ... (я думаю, я должен был упомянуть, что есть VC между UIWindow и UIView с тегом: 41) – SpokaneDude

+1

Почему вы не добавляете признак gesturer для рассматриваемого вопроса напрямую? – Till

ответ

4

попытаться прикрепить его ко всему мнению, реализовать метод делегата

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender { 
    return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]); 
} 

, если у вас есть несколько UIGestureRecognizers и делегирование для каждого, использование:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender { 
    if (self.neededGestureRecognizer == sender) { 
     return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]); 
    } 
    return YES; 
} 

в Match'em

+0

Что вы подразумеваете под «целым взглядом»? и что вы подразумеваете под «реализовать метод делегата»? (извините за хромые вопросы, но никогда не использовали UIGestureRecognizer раньше) – SpokaneDude

+0

Я имею в виду ваш взгляд UIViewController. – iiFreeman

+0

iFreeman: Я обновил вопрос с помощью кода, который у меня есть сейчас ... он все еще сообщает о теге: 41 ... есть ли способ, который я могу программно отвергнуть краном для тега: 41 и позволить ему подняться по цепочке? – SpokaneDude

Смежные вопросы