Передавать одни жесты в uiscrollview, а другие - в его содержимое?

Прошу прощения за то, что я такой новичок. Я просмотрел несколько руководств по UIGestureRecognizer и увидел несколько очень полезных ответов на SO, но создание этой уникальной комбинации жестов ускользает от меня. Вот подробности. Заранее спасибо за помощь!

FooViewController со своим собственным .xib в построителе интерфейса вписывается в эту иерархию в iOS7:

UIPopover
>> PageViewController
  >> FooViewController
    >> View (built in .xib)
      >> scrollView (just a UIScrollView)
        >> DrawingView (a UIView subclass that has touch drawing capabilities)

Его также иногда заменяют подклассом, мы назовем его FooViewControllerSubclass : FooViewController. Вот жесты, которые я создаю:

  1. При использовании FooViewControllerSubclass вместо FooViewController UIPopover должен получать жесты ущипнуть, вызывая его закрытие. В противном случае вам не нужно беспокоиться о защемлении.
  2. scrollView должен получать жесты twoFingerPan, вызывающие прокрутку.
  3. DrawingView должен получить все оставшиеся oneFingerGestures, вызывающие отрисовку.

В настоящее время 1 и 3 отлично работают. Но для 2 twoFingerPanning просто вызывает действие защемления 1. Если я закомментирую это щипковое действие, тогда twoFingerPanning просто приведет к действиям рисования oneFinger 3 в DrawingView. Краткое изложение кода находится здесь:

@implementation FooViewController

- (id)init
{
    self = [super init];
    [[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:self options:nil];
    if (self) {
            UIPanGestureRecognizer *panGR = self.scrollView.panGestureRecognizer;
            panGR.minimumNumberOfTouches = 2;
}
@end


@implementation FooViewControllerSubclass

- (id)init
{
    self = [super initWithWb:wb];
    if (self) {    
        UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPinch:)];
        [[self view] addGestureRecognizer:pinchRecognizer];
    }
    return self;
}
...
- (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer
{

    if ([[[self nextResponder] nextResponder] isKindOfClass:([PageViewController class])]) {
        [[(PageViewController*)[[self nextResponder] nextResponder] popover] dismissPopoverAnimated:YES];
    }
}
@end


@implementation DrawingView
{
...
    - (void)drawRect:(CGRect)rect{
        //Does a bunch of basic drawing stuff using touchesBegan, touchesMoved, etc.  
    }
}
@end

В качестве примечания: мне также любопытно, является ли вся эта [[self nextResponder] nextResponder] часть вообще кошерной (потому что она работает), и если нет, то как я должен передавать эту информацию вверх по иерархии.

Спасибо!


comment
Недостаточно информации, чтобы понять, что случилось. По крайней мере, для создания распознавателя жестов панорамирования необходимо ваше собственное представление прокрутки.   -  person Petro Korienev    schedule 05.01.2014
comment
Спасибо, Петр. На самом деле у меня нет настраиваемого режима прокрутки, это просто UIScrollView. Я отредактировал его, чтобы прояснить это. Спасибо,   -  person roro    schedule 05.01.2014


Ответы (1)


Пытались ли вы требовать, чтобы распознаватель жестов сдвига не работал, чтобы распознаватель жестов щипка работал успешно?

(В iOS 7 это можно сделать с помощью UIGestureRecognizerDelegate методов; в iOS 6 и ниже вам необходимо создать подкласс распознавателя щипковых жестов, чтобы переопределить -requireGestureRecognizerToFail:.)

person hatfinch    schedule 05.01.2014