9

Ho un paio di UIScrollView s nel mio controller di visualizzazione. Voglio sovrapporre una vista che cattura uno scatto a 2 dita tramite UIPanGestureRecognizer che non registra i gesti di scorrimento UIScrollView.Acquisisci solo UIView 2 dita UIPanGestureRecognizer

Quando inserisco una vista trasparente sul mio contenuto con un gesto di panoramica a 2 dita, i miei tocchi e gli scatti di 1 dito non vengono rilevati. Ho provato a sovrascrivere il metodo pointInside: per restituire NO ma poi non registra il mio dito con due dita.

L'effetto è simile al passaggio a 4 dita per cambiare app.

+0

così vuole i tuoi scrollviews di non catturare 2 colpi delle dita? – peko

+0

questa parte 1 indovina –

+0

@AndyJacobs Vuoi la vista di scorrimento per rilevare il pan o no? Vuoi aggiungere over lay che rileverà 2 finger pan e scrollview per rilevare altre pentole giusto? Se penso che sia sbagliato, per favore chiariscilo –

risposta

10

Non è necessaria una vista di sovrapposizione.
Prima implementare UIPanGestureRecognizer che gestirà 2 pan dito e assegnarlo alla vista che contiene UIScrollView s

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] 
               initWithTarget:self 
                 action:@selector(handlePan:)]; 
panGestureRecognizer.delegate = self; 
panGestureRecognizer.minimumNumberOfTouches = 2; 
panGestureRecognizer.maximumNumberOfTouches = 2; 
[self.view addGestureRecognizer:panGestureRecognizer]; 

Usa UIGestureRecognizerDelegate per gestire padella 2 dita con UIScrollView gesto pan

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

E infine si è in grado di gestire 2 dita padella

- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    NSLog(@"pan"); 
} 

Se si vuole interrompere lo scorrimento UIScrollView quando viene rilevato due pan dito è possibile disabilitare e abilitare UIScrollView di riconoscimento pan

- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    if(gestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
     _scrollView.panGestureRecognizer.enabled = NO; 
    } 
    if(gestureRecognizer.state == UIGestureRecognizerStateEnded) 
    { 
     _scrollView.panGestureRecognizer.enabled = YES; 
    } 
    NSLog(@"pan"); 
} 
3

Se non si ha realmente bisogno dell'overlay, è possibile risolvere questo problema con i soli riconoscitori di gesti. Ho scritto questo come un test:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
    _scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 2, self.view.bounds.size.height); 

    UIView *green = [[UIView alloc] initWithFrame:self.view.bounds]; 
    [green setBackgroundColor:[UIColor greenColor]]; 

    UIView *blue = [[UIView alloc] initWithFrame:CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0)]; 
    [blue setBackgroundColor:[UIColor blueColor]]; 

    [_scrollView addSubview:green]; 
    [_scrollView addSubview:blue]; 

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPan:)]; 
    [pan setMinimumNumberOfTouches:2]; 
    [pan setMaximumNumberOfTouches:2]; 
    [pan setDelaysTouchesBegan:YES]; 

    [_scrollView addGestureRecognizer:pan]; 

    [self.view addSubview:_scrollView]; 
} 

- (void)twoFingerPan:(UIPanGestureRecognizer *)gesture { 
    switch (gesture.state) { 
     case UIGestureRecognizerStateBegan: 
      self.scrollView.scrollEnabled = NO; 
      break; 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateEnded: 
     case UIGestureRecognizerStateFailed: 
      self.scrollView.scrollEnabled = YES; 
      break; 
     default: 
      break; 
    } 
    NSLog(@"2 Fingers!"); 
} 

ottengo la chiamata twoFingerPan: posteriore per quando si utilizzano 2 dita. La vista a scorrimento panGestureRecognizer funziona ancora a quel punto, quindi disabilito lo scorrimento sulla vista di scorrimento per gestire il pan a 2 dita. Ho trovato che questo metodo funziona abbastanza bene. Una sorta di cosa stupida è se la vista di scorrimento è in decelerazione, il riconoscimento di due dita non viene chiamato. Spero possa aiutare!

Problemi correlati