2011-12-04 3 views
8

Sto cercando di limitare l'area di scorrimento di UIScrollview, ma non sono in grado di farlo.UIScrollview limit swipe area

Vorrei impostare l'area di scorrimento solo nella parte superiore di UIScrollview, ma vorrei impostare tutto il contenuto visibile.

Aggiornamento:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] > 0) { 
     UITouch *tempTouch = [touches anyObject]; 
     CGPoint touchLocation = [tempTouch locationInView:self.categoryScrollView]; 
     if (touchLocation.y > 280.0) 
     { 
      NSLog(@"enabled"); 
      self.categoryScrollView.scrollEnabled = YES; 
     } 
    } 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// [super touchesEnded:touches withEvent:event]; 
    self.categoryScrollView.scrollEnabled = YES; 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

Soluzione: non dimenticate di impostare delaysContentTouches a NO sulla UIScrollView

self.categoryScrollView.delaysContentTouches = NO; 
+0

Bello! 2 anni dopo mi hai aiutato: P – NSPunk

risposta

7

è possibile disattivare lo scorrimento sul UIScrollView, ignorare touchesBegan:withEvent: nel vostro controller della vista, controllare se tutti i tocchi sono iniziati nell'area in cui si desidera attivare i passaggi e, se la risposta è "sì", riattivare lo scorrimento. Ignorare anche touchesEnded:withEvent: e touchesCancelled:withEvent: per disabilitare lo scorrimento quando i tocchi sono terminati.

+0

Ciao, qualcosa è andato storto. Il passaggio è abilitato solo al termine del tocco, non durante la fase di contatto corrente :( –

+0

@ ViskyMáté Non ero sicuro che avrebbe funzionato, ma penso che ne valesse la pena. Un'altra cosa da provare sarebbe mantenere la pergamena abilitata disabilitalo in 'touchesMoved: withEvent:' se sono fuori area e riabilita lo scroll nel 'touchesEnded' /' touchesCancelled'. – dasblinkenlight

+0

Inizia a funzionare, ma :(non funziona tutto C'è un breve ritardo prima che il tocco Begin/Cancel/Moved sparato, ecco perché se sto pizzicando velocemente, non funziona, in qualsiasi altro momento sta funzionando.Se puoi aiutarmi a disattivare questo ritardo (i non so dov'è) che sarebbe fantastico, e soluzione di successo –

4

This blog post mostra un modo molto semplice e pulito di implementare la funzionalità.

// init or viewDidLoad 

    UIScrollView *scrollView = (UIScrollView *)view; 
    _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init]; 
    _scrollViewPanGestureRecognzier.delegate = self; 
    [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier]; 

// 

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

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer == _scrollViewPanGestureRecognzier) 
    { 
    CGPoint locationInView = [gestureRecognizer locationInView:self.view]; 
    if (locationInView.y > SOME_VALUE) 
    { 
     return YES; 
    } 
    return NO; 
    } 
    return NO; 
} 
4

Altre risposte non hanno funzionato per me. La sottoclasse UIScrollView ha funzionato per me (Swift 3):

class ScrollViewWithLimitedPan : UIScrollView { 
    // MARK: - UIPanGestureRecognizer Delegate Method Override - 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     let locationInView = gestureRecognizer.location(in: self) 
     print("where are we \(locationInView.y)") 
     return locationInView.y > 400 
    } 
} 
+0

Penso che questo sia il modo "più pulito" per andare. –

+0

questo è utile, evviva – jarryd