IOS7: UIScrollView offset in UINavigationController


126

Attualmente sto migrando la mia app su iOS 7 e sono rimasto bloccato per ore sul nuovo controller di navigazione / gestione della barra.

Prima, quando avevamo un controller di navigazione, avevamo uno snippet come questo:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

In Builder interfaccia, abbiamo avuto la scelta di impostare una barra di navigazione esistente per la vista e tutto corrispondesse al contenuto della vista reale.

OK, ora non ho idea di come progettare correttamente con l'interfaccia builder. Ho ancora il mio frammento per inizializzare il mio navcontroller. Tuttavia, nel generatore di interfacce per il mio MainViewController se imposto una barra di stato su barra di navigazione traslucida o opaca, ho un offset di 44 px in alto (vedi sotto).


Interface Builder_________________________E il risultato


Ora, se imposto la barra di stato su nessuna, non vi è alcun offset nella parte superiore ma poiché la vista sul simulatore è più piccola a causa della barra di navigazione, la parte inferiore della vista nel builder dell'interfaccia viene tagliata.

Interface Builder_________________________E il risultato

Immagino che mi manchi davvero qualcosa qui, ma non riesco a trovare alcun argomento o informazioni su Apple nella Guida alle transizioni di iOS7 al riguardo.

Grazie per l'aiuto


MODIFICARE

Come possiamo vedere nelle immagini, il primo figlio della vista è un UIScrollView che contiene entrambe le etichette, il problema non si presenta in assenza di scrollview. Appare anche se è un UITableView. Se un'etichetta si trova all'esterno di UIScrollView, non vi è alcun offset rispetto a tale etichetta.


Se non lo fai, potresti utilizzare Autolayout, quindi puoi assicurarti che determinate viste siano a una distanza impostata dalla parte superiore / inferiore / laterale dello schermo
erdekhayser

In effetti non sto usando Autolayout, ma usarlo (spuntando la casella) non risolve il problema.
streem,

Con Autolayout, è necessario impostare i vincoli affinché le viste rimangano in posizione. Xcode non sa cosa vuoi automaticamente.
Erdekhayser,

Vedendo la tua modifica precedente, ho appena scoperto il tuo problema. Sfortunatamente, non è la soluzione più ovvia. Invece di provare a spiegarlo di nuovo, ho usato questo video su Youtube per imparare come impostare le viste di scorrimento. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Buona fortuna. Mi ci sono voluti un paio di volte per guardarlo per capire appieno cosa sta facendo.
Erdekhayser,

Risposte:


286

OK, quindi ho trovato la soluzione, ho impostato nel mio controller la proprietà:

self.automaticallyAdjustsScrollViewInsets = false

Non capisco davvero il vero vantaggio di questa proprietà, (o perché il valore predefinito è vero)

L'unica documentazione che ho trovato era lì:

Aggiornare

In iOS 11 automaticallyAdjustsScrollViewInsetsè obsoleto

Ora dovresti usare:

self.tableView.contentInsetAdjustmentBehavior = .never

Ti incoraggio anche a controllare questa domanda e la sua risposta per comprendere meglio tali proprietà


12
Grande scoperta. UIScrollView nello storyboard è davvero complicato. Vorrei che Apple lo rendesse un po 'fluido nelle future versioni di Xcode.
p0lAris,

4
Questo codice impedisce il mio UIScrollViewscorrimento. Ma senza questo non posso liberarmi dell'offset. Weired ...
spaventoso

9
Questo flag può anche essere disattivato nello storyboard / pennino, il controller di visualizzazione ha una casella di controllo "Regola inserti di scorrimento". Ho sbattuto la testa contro un muro per così tanto tempo ora cercando di risolvere i miei problemi con le viste di scorrimento e il layout automatico, ulteriormente complicato supportando iOS 6 e 7. Quindi grazie mille per aver finalmente fornito una soluzione!
Newtz,

2
Il documento dell'app ti direbbe che l'impostazione navigationbar.translucent = YES impedirebbe alla barra di navigazione di spingere il contenuto verso il basso. È la più grande menzogna e mi è costato molte ore di lavoro fino a questo post. Inoltre, è necessario impostare self.automaticallyAdjustsScrollViewInsets = NO; Grazie mille per questo post!!!!!!! Mela e mela?
user779764,

Ho scoperto che ciò ha causato la riduzione dei limiti del mio UIScrollView in base all'altezza della barra di navigazione (-64 punti). Ho scavalcato manualmente questo a 0, ma ho scoperto che UISrollView scorre ancora nell'asse y e si "aggancia" a una linea immaginaria a -64. La tua soluzione ha risolto questo.
gdbj,

92

@ La risposta di Justafinger ha funzionato come un incanto anche per me.

Volevo solo aggiungere che questa impostazione può anche essere regolata facilmente dal generatore di interfacce.

  1. Seleziona il tuo controller di visualizzazione
  2. Fai clic sulla scheda "Impostazioni attributi"
  3. Deseleziona "Regola scorrimento vista inserti"
  4. Godere!

inserisci qui la descrizione dell'immagine


Sono trascorsi anni a cercare questa opzione nelle proprietà di UIScrollView e non nel View Controller! Grazie!
Dominic Williams,

11

Stavo riscontrando questo stesso problema, ma ho trovato una proprietà piuttosto strana su ViewController nel generatore di interfaccia che sembra aver causato questo per me. Esiste una serie di caselle di controllo "Estendi bordi". Ho rimosso il controllo "Under Top Bars" e tutto ha iniziato a formarsi correttamente.


Sì, questo ha funzionato per me meglio di "Adjust Scroll View Insets"
Dmytro

2

Con automaticAdjustsScrollViewInsets impostato su YES (impostazione predefinita) c'è una discrepanza nel posizionamento di scrollview tra iOS6 e iOS7, quindi per renderli coerenti è necessario disabilitare questa impostazione. Tuttavia, ios6 si arresta in modo anomalo se si verifica automaticamente


2

Ho avuto un problema simile, dopo aver eliminato viewController, il contenutoOffset dal mio tableView è stato modificato in (0, -64).

la mia soluzione era un po 'strana, ho provato tutte le altre risposte ma non ho avuto successo, l'unica cosa che ha risolto il mio problema era cambiare la posizione di tableView nell'albero dei controlli di .xib

è stato il primo controllo nella vista padre in questo modo:

prima

Ho spostato tableView subito dopo ImageView e ha funzionato:

dopo

sembra che mettere la vista della tabella nella prima posizione stia causando il problema e spostare la vista della tabella in un'altra posizione risolva il problema.

PD Non sto usando AutoLayout né storyboard

spero che questo possa aiutare qualcuno!


Ho notato questo strano comportamento, credo che la logica alla base sia che gli scrollViewInsets vengono automaticamente regolati quando una scrollview è il primo figlio. Altrimenti non ha davvero senso perché la tua vista di scorrimento è probabilmente non a schermo intero.
streem

1

Devo anche affrontare questo problema.

UIScrollView la dimensione del contenuto viene calcolata dal sistema operativo come altre dimensioni, origini fornite dal sistema di vincoli - ecco perché il sistema operativo ha dubbi.

Come risolvere - Dovresti definire esplicitamente la dimensione del contenuto di UIScrollView:

  1. Incorpora contenuto scorrevole in UIView(lo rinomino in ContentView)
  2. Aggiungi vincoli:

ContentView.Weight = View.Weight e ContentView.Height = View.Height

inserisci qui la descrizione dell'immagine


0

Sembra che una soluzione alternativa sia quella di visualizzare il file dello storyboard come "iOS 6.1 e versioni precedenti" (selezionare il file dello storyboard-> Impostazioni file-> Documento di Interface Bu-> Visualizza come. Posizionare le visualizzazioni secondarie in questa modalità mostra l'offset.


Bene, non sto usando lo storyboard. Tuttavia non sono sicuro che sia un problema da iOS6 a iOS7, l'esempio sopra è stato completamente creato con iOS 7. Inoltre, ho modificato la mia domanda, appare solo (per quanto ne so) con uiscrollview e uitableview.
streem,

Hmm interessante ... Guardando a questo puoi aggiungere la variante = "6xAndEarlier" nella parte superiore della XIB nell'elemento del documento, poiché questa è la differenza quando si lancia il bit che ho menzionato sopra. E FYI questo problema si verifica anche per uiwebview per me.
Swhitman,

0

Grazie ragazzi per le soluzioni! Ho lottato per ore cercando di risolvere il problema. Tutto andava bene quando non era coinvolta la barra di navigazione ma andava in tilt nel momento in cui ho incorporato il ViewController in un NavigationController.

L'ho risolto deselezionando la voce Scorri gli inserti vista e le barre in alto . Entrambi si trovano nella finestra di ispezione degli attributi di ViewController. Grazie mille!

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.