UIScrollView non scorre

Ho un UIScrollView che contiene molti UIImageView s, UILabels, ecc … le etichette sono molto più lunghe di UIScrollView , ma quando eseguo l’app, non posso fare clic e scorrere verso il basso …

Perché potrebbe essere?

Grazie

È sempre utile mostrare uno snippet di codice funzionante completo:

 // in viewDidLoad (if using Autolayout check note below): UIScrollView *myScrollView; UIView *contentView; // scrollview won't scroll unless content size explicitly set [myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size 

Swift 4.0

 let myScrollView let contentView // scrollview won't scroll unless content size explicitly set myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size //sets ScrollView content size 

Non ho trovato un modo per impostare contentSize in IB (a partire da Xcode 5.0) .

Nota: se stai utilizzando l’Autolayout, il posto migliore in cui inserire questo codice è all’interno del metodo -(void)viewDidLayoutSubviews .

Se non riesci a scorrere la vista anche dopo aver impostato contentSize correttamente, assicurati di deselezionare “Usa layout automatico” in Interface Builder -> File Inspector.

È necessario impostare la proprietà contentSize della vista di scorrimento in modo che contentSize correttamente.

Se stai utilizzando il caricamento automatico, devi impostare contentSize in viewDidLayoutSubviews in modo che venga applicato dopo il completamento del completamento automatico.

Il codice potrebbe assomigliare a questo:

 -(void)viewDidLayoutSubviews { // The scrollview needs to know the content size for it to work correctly self.scrollView.contentSize = CGSizeMake( self.scrollContent.frame.size.width, self.scrollContent.frame.size.height + 300 ); } 

La risposta sopra è corretta – per far sì che lo scorrimento avvenga, è necessario impostare la dimensione del contenuto.

Se stai utilizzando il generatore di interfacce, un modo semplice per farlo è con gli attributi di runtime definiti dall’utente. Per esempio:

inserisci la descrizione dell'immagine qui

Prova a ridimensionare la dimensione del contenuto a numeri enormi. Non riuscivo a capire perché la mia vista di scorrimento non scorre anche quando la sua dimensione del contenuto sembra essere più grande della dimensione del controllo. Ho scoperto che se la dimensione del contenuto è più piccola del necessario, non funziona anche.

 self.scrollView.contentSize = CGSizeMake(2000, 2000); 

Invece del 2000 puoi mettere i tuoi numeri grandi. E se funziona, significa che la dimensione del tuo contenuto non è abbastanza grande quando ridimensioni.

Il delegato non è necessario perché la vista di scorrimento funzioni.

Assicurati di avere la proprietà contentSize della vista di scorrimento impostata sulla dimensione corretta (ad esempio, una abbastanza grande da includere tutti i tuoi contenuti.)

Deseleziona ‘Usa Autolayout’ ha fatto il trucco per me.

Ambiente: xCode 5.0.2 Storyboard ios7

Nel mio caso ho dovuto impostare delaysContentTouches su true perché gli oggetti all’interno della scrollView erano tutti in grado di catturare gli eventi touch e gestirli da soli invece di lasciare che lo scrollView gestisse esso stesso.

L’idea del motivo per cui la vista di scorrimento non sta scorrendo perché si imposta la dimensione del contenuto per lo scorrimento inferiore alla dimensione della vista di scorrimento, che è errata. È necessario impostare la dimensione del contenuto più grande della dimensione della visualizzazione per scorrere attraverso di essa durante lo scorrimento.

La stessa idea con lo zoom, si imposta il valore minimo e massimo per lo zoom che verrà applicato tramite l’azione di zoom.

benvenuto 🙂

Una piccola aggiunta, sopra riportata, sono i veri motivi per cui la tua vista di scorrimento potrebbe non scorrere ma a volte senza mente questo potrebbe essere il motivo specialmente quando la scrollview viene aggiunta tramite codice e non IB, potresti aver aggiunto i tuoi subviews alla vista genitore e non a la scrollview fa sì che la sottoview non scorra

e mantenere le dimensioni del contenuto impostate e maggiori rispetto al frame di visualizzazione padre (duhh !!)

Imposta la proprietà contentSize di UIScrollview nel metodo ViewDidLayoutSubviews . Qualcosa come questo

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height) } 

se ricevi un messaggio (IOS8 / swift) che viewDidLayoutSubviews non esiste, usa invece il seguente

 override func viewDidAppear(animated: Bool) 

Questo l’ha risolto per me

Qualcosa che non è stato menzionato prima!

Assicurati che la tua presa sia correttamente collegata a scrollView! Dovrebbe avere un cerchio pieno, ma anche se hai un cerchio pieno, scrollView potrebbe non essere collegato – quindi controlla due volte! Passa con il mouse sopra il cerchio e verifica se la panoramica effettiva viene evidenziata! (Questo è stato un caso per me)

 //Connect below well to the scrollView in the storyBoard @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 

Un sacco di volte il codice è corretto se hai seguito un tutorial ma quello che molti principianti non sanno è che scrollView NON scorrerà normalmente attraverso il simulatore. Si suppone di scorrere solo quando si preme il mousepad e si scorre contemporaneamente. Molti utenti esperti di XCode / Swift / Obj-C sono così abituati a fare questo e quindi non sanno come potrebbe essere trascurato dai principianti. Ciao 🙂

 @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() view.addSubview(scrollView) // Do any additional setup after the view } override func viewWillLayoutSubviews(){ super.viewWillLayoutSubviews() scrollView.contentSize = CGSize(width: 375, height: 800) } 

Questo codice funzionerà perfettamente fino a quando farai quello che ho detto sopra

Se nessuna delle altre soluzioni funziona per te, controlla che la tua vista di scorrimento sia effettivamente un UIScrollView in Interface Builder.

Ad un certo punto negli ultimi giorni, il mio UIScrollView cambiato spontaneamente tipo in UIView , anche se la sua class ha detto UIScrollView nell’ispettore. Sto usando Xcode 5.1 (5B130a) .

È ansible creare una nuova vista di scorrimento e copiare le misurazioni, le impostazioni e i vincoli dalla vecchia visualizzazione oppure modificare manualmente la visualizzazione in un UIScrollView nel file xib . Ho fatto un confronto e ho trovato le seguenti differenze:

Originale:

  ...  

Dopo il tipo cambiato spontaneamente:

  ...  

Così ho sostituito la linea con la mia linea originale .

Ho anche sostituito il tag di chiusura della vista con .

Assicurati di mantenere l’id uguale alla vista corrente, in questo caso: id = “qRn-TP-cXd”.

Ho anche dovuto svuotare lo xib dalla cache di Xcode eliminando i dati derivati ​​dell’app:

  • Xcode->Window->Organizer->Projects , scegli il tuo progetto, nella riga Dati derivati, fai clic su Elimina …

O se si utilizza un dispositivo:

  • Xcode->Window->Organizer->Device , scegli il tuo dispositivo-> Applicazioni, scegli la tua app, clicca (-)

Ora pulisci il progetto e rimuovi l’app dal simulatore / dispositivo:

  • Xcode->Product->Clean
  • iOS Simulator/device->press tieni premuto l’ app->click (X) per rimuoverlo

Dovresti quindi essere in grado di creare ed eseguire la tua app e avere di nuovo la funzionalità di scorrimento.

PS Non ho dovuto impostare la dimensione del contenuto della vista di scorrimento in viewDidLayoutSubviews o distriggersre il layout automatico, ma YMMV.

Se il tuo scrollView è una sottoview di un containerView di qualche tipo, assicurati che lo scrollView sia all’interno del frame o dei limiti di containerView . Avevo containerView.clipsToBounds = NO che mi permetteva comunque di vedere scrollView, ma poiché scrollView non rientrava nei limiti di containerView , non rilevava gli eventi touch.

Per esempio:

 containerView.frame = CGRectMake(0, 0, 200, 200); scrollView.frame = CGRectMake(0, 200, 200, 200); [containerView addSubview:scrollView]; scrollView.userInteractionEnabled = YES; 

Sarai in grado di vedere la scrollView ma non riceverà le interazioni dell’utente.

aggiungendo il seguente codice in viewDidLayoutSubviews funzionato per me con Autolayout. Dopo aver provato tutte le risposte:

 - (void)viewDidLayoutSubviews { self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620); } //set the height of content size as required 

Aggiungi UIScrollViewDelegate e aggiungendo il seguente codice al metodo viewDidAppear risolto per me.

 @interface testScrollViewController ()  -(void)viewDidAppear:(BOOL)animated { self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; self.scrollView.contentSize = CGSizeMake(375, 800); } 

Dopo aver fallito con le risposte fornite in questa discussione, mi sono imbattuto in questo articolo con la soluzione.

Ci sono due cose non intuitive nell’impostare la scrollview con l’autolayout:

  1. I vincoli impostati come margine tra contentview e scrollview non influenzano la dimensione della contentview. Sono davvero margini. E per farlo funzionare, la contentview dovrebbe avere una dimensione fissa.
  2. Il trucco per le dimensioni fisse è che puoi impostare la larghezza del contenuto uguale a quella del genitore della scrollview. Basta selezionare entrambe le viste nell’albero a sinistra e aggiungere il vincolo di larghezza uguale.

Questo è il succo di quell’articolo. Per una spiegazione completa, comprese le illustrazioni, dai un’occhiata.

L’ho fatto funzionare al mio primo tentativo. Con il layout automatico e tutto, nessun codice aggiuntivo. Poi una vista di raccolta è andata a ruba, si è schiantata in fase di esecuzione, non ho trovato quello che era sbagliato, quindi l’ho cancellata e ricreata (sto usando Xcode 10 Beta 4. Sembrava un bug) e poi lo scrolling era sparito. La vista Raccolta ha funzionato di nuovo, però!

Molte ore dopo .. questo è ciò che ha risolto per me. Ho avuto il seguente layout:

UIView

  • Area sicura
  • Scorri la vista
    • Vista del contenuto

È tutto nei limiti. Area sicura viene automaticamente definita dal sistema. Nel peggiore dei casi rimuovi tutti i vincoli per le visualizzazioni di scorrimento e di contenuto e non hai il ripristino / creazione IB per te. Fateli manualmente, funziona.

  • Per la vista Scorri, ho fatto: Allinea Trailing / Top to Safe Area. Uguale larghezza / altezza all’area sicura .
  • Per la vista Contenuto ho fatto: Allineare Trailing / Leading / Top / Bottom a Superview (la vista di scorrimento)

fondamentalmente il concetto è di avere la vista del contenuto che si adatta a Scrollview, che si adatta all’area di sicurezza.

Ma come tale non ha funzionato. La visualizzazione del contenuto ha mancato l’altezza. Ho provato tutto quello che potevo e l’unico a fare il trucco è stato un Content view height creato controllando-trascinando Content view .. a se stesso . Questo ha definito un’altezza fissa, il cui valore è stato calcolato dalla dimensione del controller della vista (definita come forma libera, più lunga della visualizzazione reale, per contenere tutte le mie sottoview) e alla fine ha funzionato di nuovo!

Ho trovato che con questo problema di AutoLayout … se faccio solo il UIView utilizzare UIView invece di UIScrollView per la class … quindi basta aggiungere un UIScrollView solo … che funzioni.