Come bloccare lo scorrimento orizzontale di una scrollView in iOS

ho una scrollView. voglio che scorra solo in una direzione (verticale). C’è un modo in cui posso bloccare lo scorrimento orizzontale … ?? …

La stessa (adattata) risposta per te come in:

Disabilitazione dello scorrimento verticale in UIScrollView

giusto, tutte le risposte qui sono ok …

ma se per qualche strana ragione il tuo contentSize dovrebbe essere superiore a UIScrollView in entrambe le dimensioni, puoi disabilitare lo scorrimento orizzontale implementando il metodo del protocollo UIScrollView -(void)scrollViewDidScroll:(UIScrollView *)aScrollView

aggiungilo nel tuo UIViewController

 float oldX; // here or better in .h interface - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)]; // or if you are sure you wanna it always on left: // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)]; } 

è solo il metodo chiamato quando l’utente scorre il tuo UIScrollView , e così facendo costringi il suo contenuto ad avere sempre lo stesso. x

 self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items); 

dovrebbe aiutare. Ho semplicemente bloccato la vista di scorrimento orizzontalmente, facendo la stessa tecnica.

Il metodo più sicuro e di maggior successo che ho trovato per limitare il movimento di una vista a scorrimento è quello di sottoclass UIScrollView e sovrascrivi setContentOffset: animato: e setContentOffset: metodi (codice sotto).

Il vantaggio di sovrascrivere questi metodi è che altera direttamente il contentOffset richiesto prima che qualsiasi codice UIKit inizi ad agire su di esso, evitando uno qualsiasi degli effetti collaterali che possono verificarsi quando si modifica contentOffset in scrollViewDidScroll: o altri metodi UIScrollViewDelegate .

Bastano pochi minuti per creare la nuova sottoclass e funziona come un incantesimo.

 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated { // restrict movement to vertical only CGPoint newOffset = CGPointMake(0, contentOffset.y); [super setContentOffset:newOffset animated:animated]; } - (void)setContentOffset:(CGPoint)contentOffset { // restrict movement to vertical only CGPoint newOffset = CGPointMake(0, contentOffset.y); [super setContentOffset:newOffset]; } 

Vedi questa domanda, devi impostare la dimensione scorrevole alla dimensione corrispondente della vista in modo che non ci sia nulla da scorrere.

Se la proprietà contentSize di UIScrollView ha la stessa larghezza effettiva di UIScrollView, non sarà ansible scorrere orizzontalmente.

Stai volendo interrompere lo scorrimento orizzontale quando lo scorrimento orizzontale sarebbe valido? (cioè il contentSize è più largo della larghezza effettiva di UIScrollView?) Se “sì”, perché vuoi farlo?

Puoi provare questo,

 self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450); 

qui 1450 è la mia altezza di visualizzazione.

La scrollView è scorrevole solo orizzontalmente se si imposta la larghezza di contentSize più grande della scrollView frame. Se si imposta la larghezza contentSize allo stesso valore della scrollview non scorrerà. Per esempio

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

oh da quando iOS7 usa questo (in initWithNibName):

 self.automaticallyAdjustsScrollViewInsets = NO; 

e crea lo scroller di pagina con 3 pagine

 self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; [self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)]; [self.pageView setShowsVerticalScrollIndicator:NO]; [self.pageView setPagingEnabled:YES]; [self.view addSubview:self.pageView]; 

Nel mio caso il contentSize era superiore a UIScrollView per x e y. Per me la risposta di meronixe ha funzionato abbastanza bene, ma era per le mie esigenze non del tutto complete. Sfortunatamente la barra di scorrimento orizzontale era ancora visibile.

Questo potrei cambiare con il seguente codice in

 - (void)webViewDidFinishLoad:(UIWebView *)webView [self.webView.scrollView setShowsHorizontalScrollIndicator:NO]; 

veloce

Rendi contentOffset.x = 0 per disabilitare lo scorrimento orizzontale

  extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollView.contentOffset.x = 0//to lock horizontal scrolling //scrollView.contentOffset.y = 0//to lock vertical scrolling } } 

Inoltre è ansible disabilitare l’indicatore di scorrimento come

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator