Ho un UIView
trampolino di lancio come iPhone. L'ho creato usando un UIScrollView
and UIButtons
. Voglio disabilitare lo scorrimento orizzontale su detto scrollview. Voglio solo lo scorrimento verticale. Come ci riesco?
Ho un UIView
trampolino di lancio come iPhone. L'ho creato usando un UIScrollView
and UIButtons
. Voglio disabilitare lo scorrimento orizzontale su detto scrollview. Voglio solo lo scorrimento verticale. Come ci riesco?
Risposte:
Devi impostare la contentSize
proprietà del file UIScrollView
. Ad esempio, se il tuo UIScrollView
è largo 320 pixel (la larghezza dello schermo), puoi farlo:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Il UIScrollView
sarà quindi scorrere solo verticalmente, perché può già visualizzare tutto in orizzontale.
AGGIORNATO: (Dopo che @EranMarom ha sottolineato il suo commento)
È possibile interrompere lo scorrimento orizzontale o verticale nel ScrollViewDelegate
Metodo. Ecco come
Arresta lo scorrimento orizzontale:
Se vuoi scorrere orizzontalmente, devi aumentare il contentOffset.x. Impedendo che si arresti lo scrollview scorre in direzione orizzontale.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Arresta lo scorrimento verticale:
Se vuoi scorrere verticalmente, devi aumentare il contentOffset.y. Impedendo che si arresti lo scrollview scorrere in direzione verticale.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Il codice precedente impedisce le modifiche in x
e y
di a scrollview contentOffset
e porta a interrompere lo scorrimento in scrollViewDidScroll:
metodo.
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
per disabilitare lo scorrimento orizzontale. Lo trovo più leggibile, è più piccolo e non ha senso fare il test per zero perché non c'è praticamente alcun sovraccarico con il codice che lo esegue raramente (cioè poche decine di volte al secondo al massimo).
scrollView.contentOffset.y = 0.0
per interrompere lo scorrimento verticale e scrollView.contentOffset.x = 0.0
per interrompere lo scorrimento orizzontale, nella scrollViewDidScroll()
funzione delegato. Tuttavia, credo che assicurarsi che sia scrollView.contentSize
uguale a scrollView.frame.size
sia una soluzione migliore (corretta). Vedi la risposta di @danbeaulieu.
dall'uso di iOS7
self.automaticallyAdjustsScrollViewInsets = NO;
// e crea il tuo scroller di pagine 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];
self.collectionView.pagingEnabled = YES;
mi ha aiutato a risolvere il problema con lo scorrimento fluido (non il trascinamento). Il problema era nel metodo scrollViewWillEndDragging:
: targetContentOffset era lo stesso di scrollView.contentOffset e la logica di rilevamento della pagina non funziona correttamente.
Soluzione rapida
Crea due punti vendita, uno per la tua visualizzazione e uno per la visualizzazione a scorrimento:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Quindi nel tuo viewDidLayoutSubviews puoi aggiungere il seguente codice:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Quello che abbiamo fatto è raccogliere l'altezza e la larghezza della visualizzazione e impostare la dimensione del contenuto scrollViews in modo che corrisponda. Ciò interromperà lo scorrimento orizzontale della visualizzazione a scorrimento.
Altri pensieri:
CGSizeMake prende una larghezza e un'altezza usando CGFloats. Potrebbe essere necessario utilizzare l'altezza esistente di UIScrollViews per il secondo parametro. Che sarebbe simile a questo:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
Nel mio caso, con Swift 4.2 puoi usare:
Disabilita lo scorrimento verticale:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Disabilita lo scorrimento orizzontale:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
Nel mio caso la larghezza del contentView era maggiore della larghezza di UIScrollView e questo era il motivo dello scorrimento orizzontale indesiderato. L'ho risolto impostando la larghezza di contentView uguale alla larghezza di UIScrollView.
Spero che aiuti qualcuno
Ho lottato con questo per un po 'di tempo provando senza successo i vari suggerimenti in questo e in altri thread.
Tuttavia, in un altro thread (non so dove) qualcuno ha suggerito che l'utilizzo di un vincolo negativo su UIScrollView ha funzionato per lui.
Quindi ho provato varie combinazioni di vincoli con risultati incoerenti. Quello che alla fine ha funzionato per me è stato aggiungere i vincoli iniziali e finali di -32 alla scrollview e aggiungere una textview (invisibile) con una larghezza di 320 (e centrata).
Introdotta in iOS 11 è una nuova proprietà su UIScrollView
var contentLayoutGuide: UILayoutGuide
La documentazione afferma che:
Utilizzare questa guida al layout quando si desidera creare vincoli di layout automatico relativi all'area del contenuto di una visualizzazione a scorrimento.
Insieme a qualsiasi altro vincolo di layout automatico che potresti aggiungere, vorrai vincolare il numero widthAnchor
degli UIScrollView
"s" contentLayoutGuide
alla stessa dimensione del "frame". Puoi utilizzare il frameLayoutGuide
(introdotto anche in iOS 11) o qualsiasi larghezza esterna (come la tua superView
).
esempio:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Documentazione: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Una volta che l'ho fatto sostituendo UIScrollView con un UITableView con solo 1 cella, ha funzionato bene.
Usa questa singola riga.
self.automaticallyAdjustsScrollViewInsets = NO;