Disabilitazione dello scorrimento verticale in UIScrollView


Risposte:


121

Prova a impostare l'altezza di contentSize sull'altezza di scrollView. Quindi lo scorrimento verticale dovrebbe essere disabilitato perché non ci sarebbe nulla da scorrere verticalmente.

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

Mi hai appena risparmiato un sacco di tempo per il debug di questo strano problema. Grazie!
jpm

2
@fabb come si fa a sapere quando la cornice è cambiata?
Sam

138

da iOS7:

primo: la larghezza della dimensione del contenuto deve essere uguale alla larghezza della visualizzazione di scorrimento

secondo: nel tuo initWithNibName:

self.automaticallyAdjustsScrollViewInsets = NO;

Questo è tutto.


Ottima soluzione. Ha funzionato come un fascino. Influirà sulle dimensioni del resto delle visualizzazioni nel mio ViewController? (Buttons, Labels ..) Voglio dire, "self" è un UIViewController nel mio caso
voghDev

@voghDev no, non ha alcun effetto sulle sottoview nella tua scrollview.
Mirko Brunner

Amazing ha aggiunto questo al metodo viewdidload sui miei controller di visualizzazione che presentavano problemi.
StackRunner

se stai usando navigationController e il tuo scrollview è dietro il titolo della navigationBar come il mio, usa il metodo viewDidLoad. Risolve.
EFE

1
Puoi ottenere lo stesso risultato nelle impostazioni dello storyboard direttamente senza alcuna riga di codice. Seleziona semplicemente il controller della visualizzazione a scorrimento e deseleziona "Regola gli inserti della visualizzazione di scorrimento" nell'ispettore degli attributi.
Morpheus78

49

si, la risposta di pt2ph8 è giusta,

ma se per qualche strana ragione il tuo contentSize dovesse essere superiore a UIScrollView, puoi disabilitare lo scorrimento verticale implementando il metodo del protocollo UIScrollView

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

basta aggiungerlo nel tuo UIViewController

float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

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


6
Dio! Si prega di NON dichiarare la variabile oldY nel file .m come float oldY;fare riferimento al codice sopra. Questo è un simbolo di variabile in stile C per applicazione, la variabile DEVE essere dichiarata come membro di istanza della classe controller.
Itachi

21

Includere il seguente metodo

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

e impostare la larghezza della dimensione del contenuto della visualizzazione di scorrimento uguale alla larghezza della visualizzazione di scorrimento.


1
Questo può essere fatto anche in Storyboard selezionando il controller di visualizzazione e deselezionando la proprietà lì
justColbs

1
Non mi piace questo perché stabilisce per tutte le viste di scorrimento ... desidera si può essere specifico di una vista di scorrimento sullo schema w / o la creazione di una nuova classe ScrollView ecc
visc

20

È necessario passare 0 nella dimensione del contenuto per disabilitare in quale direzione si desidera.

Per disabilitare lo scorrimento verticale

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

Per disabilitare lo scorrimento orizzontale

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

1
Questo imposterà contentSize della vista in modo che abbia 0 sull'asse impostato. ContentSize si riferisce alla dimensione del contenuto, quindi vogliamo passare l'altezza dello schermo per disabilitare lo scorrimento verticale oltre quel frame. la soluzione contrassegnata come corretta è corretta.
sistema

Questo ha funzionato bene per me. l'impostazione dell'altezza come altezza di contentSize mi ha comunque fatto scorrere in verticale.
KoreanXcodeWorker

1
Questo non ha funzionato per me. Ho anche provato self.automaticallyAdjustsScrollViewInsets
StackRunner

Questo è! L'impostazione dell'altezza della visualizzazione a scorrimento non ha funzionato per me, ma ha funzionato
Echizzle

18

Ho aggiornato la dimensione del contenuto per disabilitare lo scorrimento verticale e la possibilità di scorrere è rimasta comunque. Poi ho capito che dovevo disabilitare anche il rimbalzo verticale, per disabilitare completamente lo scorrimento.

Forse ci sono anche persone con questo problema.


Mi hai salvato. Il mio contenuto Dimensioni e cornice erano le stesse e non potevo per la vita di me capire cosa fosse sbagliato. Grazie mille!!
yuf

2
La tua risposta è perché amo stackoverflow! :-) Santo fumo ... questo mi ha fatto impazzire! Hai ragione. È l'effetto rimbalzo. Voglio l'effetto rimbalzo, ma non quando non è necessario scorrere, quindi cercherò di disabilitare / riabilitare quell'effetto ora nel codice a seconda che sia necessario scorrere.
Erik van der Neut

2
Ok, è molto facile abilitare / disabilitare i rimbalzi su un UIScrollView in fase di esecuzione. Nel mio caso mi interessa solo l'altezza del contenuto di scorrimento e questo ha funzionato: self.scrollView.bounces = (BOOL) (self.scrollView.contentSize.height> self.scrollView.frame.size.height);
Erik van der Neut

12
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

devi aver confermato a UIScrollViewDelegate

aScrollView.delegate = self;

4

Basta impostare la y per essere sempre in primo piano. È necessario conformarsi a UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}

Ciò manterrà l'effetto Decelerazione / Accelerazione dello scorrimento.


4

Su iOS 11, ricordati di aggiungere quanto segue, se sei interessato a creare una visualizzazione a scorrimento che si attenga ai limiti dello schermo piuttosto che a un'area sicura .:

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

1
Dopotutto. grazie mille volte signore! mi hai salvato la giornata
ha100

1

Da iOS11 è possibile utilizzare la seguente proprietà

let frameLayoutGuide: UILayoutGuide

Se imposti i vincoli per frameLayoutGuide.topAnchor e frameLayoutGuide.bottomAnchor agli stessi ancoraggi di alcune sottoview del tuo scrollView, lo scorrimento verticale sarà disabilitato e l'altezza di scrollView sarà uguale all'altezza della sua sottoview.


1

La soluzione più ovvia è proibire i cambiamenti delle coordinate y nella tua sottoclasse.

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: newValue.x, y: 0)
  }
}

Questa è l'unica soluzione adatta in situazioni in cui:

  1. Non sei autorizzato o semplicemente non vuoi usare delegato.
  2. L'altezza del contenuto è maggiore dell'altezza del contenitore

1
Questa è la migliore risposta! Dovrebbe essere selezionato come soluzione! Grazie amico mi hai salvato la giornata!
imike

@imike la mia soluzione preferita è usare swizzling (: controlla il repository github.com/iwheelbuy/UIPanGestureRecognizerDirection
iWheelBuy

0

Molte risposte includono l'impostazione contentOffsetdi 0. Ho avuto un caso in cui volevo che la vista all'interno di scrollView fosse centrata. Questo ha fatto il lavoro per me:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.