2014-09-22 5 views
13

Desidero ottenere il funzionamento di AutoLayout con UIScrollView e ho qualche problema con esso. Ecco quello che ho fatto:UIScrollView AutoLayout Solo verticale

  1. Aggiungi un UIScrollView all'interno della vista principale con cornice: [top: 0, a sinistra: 0, Larghezza: 320, Altezza: 568]

  2. Aggiungere UIView "contentView" all'interno del UIScrollView con telaio e bgcolor nero: [top: 0, a sinistra: 0, larghezza: 320, altezza: 568]

  3. Setup UIScrollView vincoli: [top: 0, bottom: 0, a sinistra: 0, a destra: 0]

  4. Setup vincoli "contentView": [top: 0, in basso: 0, a sinistra: 0, a destra: 0]

  5. allineare gli elementi all'interno del "contentView"

  6. Imposta vista principale bgcolor al grigio (a vedere cosa sta succedendo)

Ecco uno screenshot del problema: http://imgur.com/P8s9lB0

Per qualche ragione, i vincoli rendono la vista dei contenuti sia al centro dello schermo. Inoltre, scorre in ogni direzione. Voglio che il contenuto sia scorrevole solo in direzione verticale come in UITableView, in modo che non possa spostarlo in questo modo: http://imgur.com/lBCwfAS

Cosa sto facendo male? Ho controllato tutte le esercitazioni e le risposte che riesco a trovare su StackOverflow e Google, e in realtà nessuno ha un problema bizzarro, quindi chiedo aiuto.

MODIFICA: ho aggiunto anche la larghezza e l'altezza di ContentView come vincoli e anche questo non è stato d'aiuto.

risposta

16

per disabilitare l'scorrimento orizzontale, è possibile impostare le dimensioni contenuti nella (void) metodo scrollViewDidScroll.

[self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)]; 

Si desidera inoltre impostare il blocco di direzione in modo che venga utilizzata solo una direzione di scorrimento alla volta. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

self.scrollView.directionalLockEnabled = YES; 
+0

Grazie! Lo scroll orizzontale è disabilitato. – Gasim

+0

no prob .. come per il problema del layout automatico, stai usando il generatore di interfacce o usando il layout automatico attraverso il codice? – Derek

+0

Sto usando il generatore di interfacce. Ho cambiato il vincolo a sinistra e a destra a -16 e ha funzionato. Non credo sia il comportamento corretto. C'è un modo per farlo funzionare con 0? – Gasim

1

Dare vista dei contenuti altezza esplicito e vincoli di larghezza

+0

ho fatto -> Larghezza: 568, Altezza: 320. Nessuna fortuna – Gasim

+0

Forse la visualizzazione dei contenuti è Shrinker con le sue sottoview. Stai ottenendo eccezioni per il layout automatico? – mustafa

+0

Non, non uno solo. Ecco la cosa.Ho iniziato a giocare con i valori dei vincoli e mettere -16 per i vincoli di testa e di coda ha effettivamente fissato la vista al centro ... Non voglio davvero fare affidamento su un numero come quello. Quale può essere la causa di questo problema? Che cosa intendi per Shrinker? Inoltre, ora anche se la scrollview funziona, non scorre nella posizione desiderata. – Gasim

3

Ho scritto una funzione che permette di scorrere i contenuti in verticale, ma non in senso orizzontale. Crea un UIView con larghezza limitata all'interno di scrollview e incorpora tutte le sottoview di scrollview in esso.

TegScrolledContent.createContentView(scrollView) 

https://github.com/exchangegroup/scrollable-content-ios

enter image description here

+0

Grazie a evegenii, la tua libreria mi aiuta davvero nella mia vista di accesso quando vai a sinistra e a destra del paesaggio .. –

6

Per riassumere il Leszek S' risposta:

al fine di avere una visione a scorrimento verticale, tutti i punti di vista all'interno della vista di scorrimento devono avere il lorovincolo larghezza impostato. Facile da impostare sulla visualizzazione panoramica della vista.

Il motivo è che la vista di scorrimento non scorrerà orizzontalmente in modo tale che nessuna delle sue sottoview debba scorrere orizzontalmente. Ad esempio, se si dispone di un'etichetta, impostata su 0 linee, il layout automatico proverà a rendere l'etichetta più ampia possibile prima di iniziare ad aggiungere linee e interruzioni di riga. Se non ci sono vincoli di larghezza espliciti sull'etichetta, si limiterà a ingrandire l'area del contenuto della vista di scorrimento. I vincoli per il trascinamento della vista di scorrimento vengono ignorati.

Se si dispone di un gruppo di viste, è possibile che si desideri inserirle in una singola vista contenente come in quel video. Per il mio caso, ho solo 5 o 6 etichette che possono cambiare l'altezza in modo dinamico, ma non dovrebbero mai cambiare larghezza, quindi ho appena creato tutte la stessa larghezza della vista di scorrimento. E bingo, vista a scorrimento verticale con etichette che crescono o si restringono a seconda del testo.

1

Di seguito è riportato uno snippet che ho utilizzato per ottenere una vista di scorrimento verticale. Funziona aggiungendo una vista contenuto come una vista secondaria di una vista di scorrimento, quindi vincolando la larghezza della vista di contenuto alla larghezza della vista di scorrimento principale. Da quel momento, tutte le sottoview dovrebbero essere aggiunte alla vista del contenuto piuttosto che alla vista di scorrimento.

// View that will contain content of scroll view. Width is constrained to the width of the scroll view. 
UIView *contentView = [[UIView alloc] init]; 
contentView.translatesAutoresizingMaskIntoConstraints = NO; 
[scrollView addSubview:contentView]; 

views[@"contentView"] = contentView; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]]; 

// Now, add all your subviews to contentView 
7

Si può fare tutto usando i vincoli ed è davvero facile.

Lo UIScrollView ha solo bisogno di capire quanta larghezza e spazio ha al suo interno. Quindi è necessario avere qualcosa attaccato ai vincoli Leading, Trailing, Top & Bottom. Anche la larghezza e l'altezza del contenuto deve essere fissato (ciò non significa che debba specificy esso. Posso ancora utilizzare i vincoli per realizzare questo.)

  1. Aggiungere un UIScrollView e posizione come richiesto.
  2. Aggiungere UIView all'interno dello UIScrollView per il contenuto.
  3. Impostare i Leading, Trailing, Top & Bottom vincoli del contenuto UIView a 0.
  4. Aggiungi un Equal Width vincolo al UIScrollView e UIView. Questo lo farà solo scorrere verticalmente.
  5. Ora è necessario impostare l'altezza del contenuto UIView. È quindi possibile specificare l'altezza della visualizzazione del contenuto (blech) o utilizzare l'altezza dei controlli contenuti all'interno assicurandosi che il controllo inferiore sia vincolato alla parte inferiore della vista del contenuto.

Ho fatto questo e ha funzionato a meraviglia.

+1

Questa era la risposta che stavo cercando. Ho avuto il contentView uguale alla superview di UIScrollView. Grazie –

1

Insieme alla risposta di @derek, vorrei aggiungere che l'impostazione contentOffset sempre in scrollViewDidScroll causerà problemi di prestazioni. Quindi, per favore controlla solo se x non è 0 quindi impostare contentOffset

if(contentOffset.x != 0){ 
     setContentOffset(CGPointMake(0, contentOffset.y), animated: false) 
    } 

e sì alla ScrollView

directionalLockEnabled = true