18

Ho un UICollectionView con un UICollectionViewLayout personalizzato (in realtà, sto usando this nice layout).UICollectionView contentOffset cambia con il layout personalizzato

Ho impostato contentOffset = CGPointZero in viewDidLoad. Dopo viewDidLoad, tuttavia, l'offset è -20, e il contenuto viene spinto verso il basso in questo modo:


picture

(Va a filo con la linea). Sto caricando il layout della vista dell'insieme nel generatore di interfacce. Sembra che il mio problema sia molto simile a this one, tuttavia le soluzioni lì non funzionano per me.

Ho provato a modificare collectionViewContentSize nell'implementazione del mio layout per assicurarmi che fosse sempre maggiore della dimensione della collectionView. Anche se questo significa che posso far scorrere il mio contenuto verso il basso (è più corto dell'altezza del collectionView) e nascondere lo spazio extra, posso anche tornare indietro per vederlo.

Nulla sembra funzionare!

risposta

13

L'unica soluzione ho potuto trovare che aveva un comportamento malapena-accettabile:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (self.collectionView.contentOffset.y < 0) { 
     self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0); 
    } 
} 

Oltre a impostare l'altezza del contenuto di fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight]) in collectionViewContentSize

Ciò rimuove lo spazio sopra la sezione intestazione, ma rimuove il "rimbalzo" dall'alto. Una soluzione piuttosto sub-ottimale, ma abbastanza accettabile.

Accetterò una risposta migliore se qualcuno ne ha uno, o se trovo uno aggiornerò questa risposta.

+1

Ho un problema simile quando si utilizza il layout orizzontale. –

+0

Nel layout veritacale il contenuto è OK. quando si modifica l'oggetto di layout in orizzontale tutto il contenuto scompare. –

+0

Lo stesso problema e la stessa soluzione che ho trovato. Ottengo questo solo su iOS7 SDK e solo quando è in esecuzione su iOS7.La cosa più strana è che un altro scrollView in un altro viewController non ha questo problema .. Mi si rompe la testa, ma non ho trovato un motivo –

45

Ho trovato il motivo per cui ciò accade. Controllare la risposta accettata da questa domanda: Status bar and navigation bar appear over my view's bounds in iOS 7

In effetti, potremmo semplicemente impostare edgesForExtendedLayout o automaticallyAdjustsScrollViewInsets proprietà di UIViewController in IB (se si utilizza Storyboard) di in viewDidLoad e sarà risolvere il nostro problema.

Basta non dimenticare verificare la presenza di questa proprietà è disponibile, perché in iOS6 o prima causerà incidente:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { 
    self.automaticallyAdjustsScrollViewInsets = NO; 
} 

saluti!

+6

Nota che se hai un controller di visualizzazione collezione contenuto in un controller di visualizzazione genitore, devi impostare 'automaticallyAdjustsScrollViewInsets 'sul controller * parent *. – zoul

+0

Avevo un caso in cui volevo collocare una collectionView con celle da 74h per 30w che venivano compensate da -44 ogni volta che passavo dal controllore della vista genitore a un altro. Ho provato a risolvere questo problema per quasi due ore provando così tanti modi sbagliati. Grazie. – devdc

0

Ho iniziato a trovare questo problema visualizzato su iOS 11 in cui avevo una vista a scorrimento all'interno di una vista di scorrimento. Mi ci è voluto quasi un giorno per capirlo.

impostare il comportamento di regolazione inserto contenuto Prova:

if #available(iOS 11.0, *) { 
    scrollView.contentInsetAdjustmentBehavior = .never 
} 

Questo risolto il mio CollectionView regolazione è inserto contenuto giù una piccola quantità, come il telaio CollectionView sposterebbe oltre la zona di sicurezza del ScrollView racchiude.