2012-02-04 11 views
6

Ho una vista di scorrimento e voglio farla sparire ogni volta che si esegue un pan. Funziona bene e su panning, scrollview scompare, ma il problema è ora non posso scorrere il contenuto.Lo scrolling è disabilitato quando aggiungo A UIPangesturerecognizer a UIScrollView

[UIView animateWithDuration:0.2 
         delay:0.2 
        options: UIViewAnimationCurveLinear 
       animations:^{ 
        slideView.frame=CGRectMake(268, 0, 500, 950); 
        curtain.frame=CGRectMake(0, 0, 268, 950); 
        curtain.backgroundColor=[[UIColor alloc]initWithRed:0 green:0 blue:0 alpha:0.6]; 
        [self.view addSubview:slideView]; 
        [self.view addSubview:curtain]; 

       } 
       completion:^(BOOL finished){ 
        NSLog(@"Done!"); 
       }]; 

Ecco come ho come faccio a comparire il mio UIScrollView (SlideView è ScrollView) .E poi aggiungo un pangesturerecognizer.All funziona bene, ma lo scorrimento è disabilitata. (panImage nasconde di nuovo la mia vista scorrevole.) come far funzionare lo scorrimento. ??

[slideView addGestureRecognizer:panImage]; 

risposta

12

UIScrollView ha il proprio riconoscitore di movimento panoramico, che controlla lo scorrimento. Aggiungendo un altro riconoscitore di movimento panoramico, si impedisce il funzionamento del riconoscitore di movimento panoramico della vista di scorrimento.

Esistono diversi modi per risolvere questo problema, ma sarebbe utile se si potesse spiegare come il sistema dovrebbe sapere quando l'utente sta tentando di chiudere la vista di scorrimento e quando sta provando a scorrere, dal momento che vuoi un gesto pan per fare entrambe le cose.

Ad esempio, è possibile impostare i delegati di entrambi i riconoscitori di gesti per consentire ai riconoscitori di operare simultaneamente (sovrascrivendo il metodo gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:). È possibile fare in modo che ciascun riconoscimento di gesti richieda un numero diverso di tocchi (impostando le proprietà minimumNumberOfTouches e maximumNumberOfTouches). È possibile utilizzare un UISwipeGestureRecognizer per riconoscere il gesto di rimozione. È possibile rilevare quando l'utente tenta di scorrere oltre il bordo sinistro della vista di scorrimento ignorando il metodo scrollViewDidScroll: del delegato della vista di scorrimento.

+1

È necessario riconoscere più gesti contemporaneamente, ma devi anche disabilitare lo scorrimento mentre gestisci il tuo gesto. Vedi @miroslav. – SwiftArchitect

2

È possibile impostare le priorità del proprio PanGestureRecognizers manualmente. Ecco come ho risolto lo stesso problema: in delegato (BOOL) gestureRecognizerShouldBegin: ho reso disabilitato lo scorrimento nella mia scrollView se dovesse restituire SI. E all'inizio di un selettore del mio panGestureRecognizer ho attivato lo scorrimento.

In questo delegato è possibile creare una condizione del proprio panGestureRecognizer per abilitare tale modalità, che funzionerà se e solo se si desidera che abbia una priorità maggiore.

1

metodo Swift,
necessario aggiungere UIGestureRecognizerDelegate alla classe:

class ViewController: UIViewController, UIGestureRecognizerDelegate { 

necessario impostare il suo delegato per sé:

override func viewDidLoad() { 
    super.viewDidLoad() 
    var scrollView = UIScrollView(frame: self.view.frame) 
    scrollView.delegate = self 
} 

Aggiungi questa parte nei tuoi metodi di classe a gesti simultanei attivi :

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 
Problemi correlati