UIGestureRecognizer для части UIView - PullRequest
9 голосов
/ 19 февраля 2012

Я использую UIGestureRecognizer в своем приложении для iOS, и у меня возникают некоторые проблемы.

Я хочу, чтобы жесты работали только в определенной области представления, поэтому я создал новый UIView с определеннымкадр и добавил его в корневой вид.Жесты хорошо работают с этим, но единственная проблема сейчас в том, что я не могу щелкнуть материал, который находится под / позади этого нового представления (объекты, которые находятся в корневом представлении).Если я установлю для userInteractionEnabled значение NO, это приведет к нарушению жестов, так что это не вариант.

Что можно сделать, чтобы это исправить?

Спасибо.

1 Ответ

33 голосов
/ 19 февраля 2012

Не создавайте новый вид для вашего распознавателя жестов. Распознаватель реализует метод locationInView:. Установите его для представления, которое содержит чувствительный регион. На маркере handleGesture выполните тестирование региона, который вас интересует, следующим образом:

0) Делайте все это в представлении, содержащем интересующий вас регион. Не добавляйте специальный вид только для распознавателя жестов.

1) Настройка mySensitiveRect

@property (assign, nonatomic) CGRect mySensitiveRect;
@synthesize mySensitiveRect=_mySensitiveRect;
self.mySensitiveRect = CGRectMake(0.0, 240.0, 320.0, 240.0);

2) Создайте жест-распознаватель:

gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[self.view addGestureRecognizer:gr];
// if not using ARC, you should [gr release];
// mySensitiveRect coords are in the coordinate system of self.view


- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
    CGPoint p = [gestureRecognizer locationInView:self.view];
    if (CGRectContainsPoint(mySensitiveRect, p)) {
        NSLog(@"got a tap in the region i care about");
    } else {
        NSLog(@"got a tap, but not where i need it");
    }
}

Чувствительный прямоугольник должен быть инициализирован в системе координат myView, в том же виде, к которому вы присоединяете распознаватель.

...