2010-10-19 12 views
7

Ho un UIScrollView che sta scorrendo un UIView abbastanza grande.Limitare l'area scorrevole in UIScrollView

In determinati momenti, desidero limitare l'area in cui l'utente può scorrere. Ad esempio, posso solo consentire loro di visualizzare il quarto inferiore della vista.

Sono in grado di limitare l'area sovrascrivendo scrollViewDidScroll e quindi chiamando setContentOffset se la vista ha scostato troppo lontano. Ma in questo modo non riesco a farlo rimbalzare così facilmente come può fare naturalmente UIScrollView quando si scorre oltre i limiti di UIView.

C'è un modo migliore per limitare l'area scorrevole in un UIScrollView?

risposta

17

Cambiare la proprietà contentSize della vista di scorrimento in base alla dimensione dell'area in cui si desidera che l'utente possa scorrere e regolare il frame.origin della sottoview come il limite in alto a sinistra che si desidera (0, 0) relativo alla visualizzazione di scorrimento. Ad esempio, se la tua vista è alta 800 punti e vuoi mostrare il quarto inferiore, imposta l'altezza di contentSize su 200 e imposta il componente y di view.frame.origin su -600.

+3

tua risposta è stata solo la punta giusta avevo bisogno di risolvere un problema simile che ho avuto. Fondamentalmente la differenza tra uiscrollview.frame.size e uiscrollview.contentsize diventa la porzione scorrevole consentita. Puoi giocare con la visione utente che è posizionata nella vista di scansione in qualsiasi modo desideri ottenere l'effetto desiderato desiderato usando uiview.frame e uiview.size. Una volta capito questo, la vita è buona. Scorrimento felice! :) – HM1

+0

Ecco un esempio di soluzione che ha incapsulato la logica simile: https://github.com/ealeksandrov/EARestrictedScrollView –

2

Ho trovato qualcosa che funziona per me. E ti permette di scorrere al punto 0,0 ma non oltre:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.x <= -1) { 
     [scrollView setScrollEnabled:NO]; 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
     [scrollView setScrollEnabled:YES]; 
    } 
} 

Si potrebbe fare lo stesso per la parte superiore, in basso oa destra (X o Y)

+2

Il problema con questo metodo è che si perde il "rimbalzo" - dove si scorre oltre la regione e lo scorrimento delicatamente scatta indietro quando lasci andare. –

+0

Crap hai ragione, non ha letto correttamente. Comunque, forse questo può aiutare qualcun altro. – Yoko

0

Un altro approccio è quello di sovrascrivere il metodo 's il UIScrollView :

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event.

Il reso YES consentirà all'utente di scorrere. Restituzione di NO no.

NOTA: Questo disabilita tutti i tocchi per eventuali pareri incastrati all'interno delle UIScrollView che pointInside ritorna NO a. Utile se l'area da cui non vuoi scorrere non ha alcuna interazione.


Questo esempio consente solo l'UIScrollView per scorrere quando l'utente sta scorrendo sopra un UITableView. (A UITableView e due UIViews sono inserita all'interno del UIScrollView)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *subview in self.subviews) { 
     if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) { 
      return NO; 
     } 
    } 
    return YES; 
}