2014-05-11 12 views
20

Ho un UICollectionViewController utilizzando un UICollectionViewFlowLayout dove il mio itemSize è la dimensione dello UICollectionView. Fondamentalmente, questo è un layout di linee di celle in cui ogni cella è a schermo intero e scorre orizzontalmente.Perché UICollectionView registra un errore quando le celle sono a schermo intero?

Nel mio UICollectionViewFlowLayout sottoclasse, ho ignorato prepareLayout come segue:

- (void)prepareLayout { 
    self.itemSize = self.collectionView.frame.size; 
    self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
    self.collectionView.pagingEnabled = YES; 
    self.minimumLineSpacing = 0.0; 
    self.minimumInteritemSpacing = 0.0; 
    self.sectionInset = UIEdgeInsetsZero; 
    self.footerReferenceSize = CGSizeZero; 
    self.headerReferenceSize = CGSizeZero; 
} 

Il UICollectionViewController è molto semplice ritorno 10 articoli in una sezione. Ho incluso uno sample project on GitHub per ulteriori dettagli.

Tutto sembra impostato correttamente. Sembra proprio nel simulatore e sul dispositivo, ma, quando viene visualizzata la vista raccolta, v'è un errore connesso alla console:

the behavior of the UICollectionViewFlowLayout is not defined because: 
the item height must be less that the height of the UICollectionView minus the section insets top and bottom values. 

Si noti anche che la vista del regolatore di raccolta nel mio esempio si trova in un controller di navigazione e mentre questo non sembra particolarmente necessario nell'esempio, nel mio caso reale ho bisogno della vista raccolta in un controller di navigazione.

risposta

58

C'è una proprietà su UIViewController - automaticallyAdjustsScrollViewInsets default -che a YES. Ciò significa che quando uno UIScrollView nella sua gerarchia di visualizzazione, che è true di una UICollectionViewController, la proprietà contentInset di quella visualizzazione di scorrimento viene regolata automaticamente per tenere conto delle aree dello schermo utilizzate dalla barra di stato, dalla barra di navigazione e dalla barra delle schede. .

La documentazione per che gli stati di proprietà:

automaticallyAdjustsScrollViewInsets

Specifica se il controller della vista dovrebbe regolare automaticamente la sua vista di scorrimento inserti.

@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets

Discussione

valore predefinito è Sì, che permette al controller della vista per regolare la sua vista di scorrimento inserti in risposta alle aree dello schermo consumati dalla barra di stato, barra di navigazione e barra degli strumenti o barra delle linguette. Impostare su NO se si desidera gestire personalmente le regolazioni della vista di scorrimento, come ad esempio quando c'è più di una vista di scorrimento nella gerarchia della vista.

La soluzione è quella di impostare automaticallyAdjustsScrollViewInsets-NO qualche parte nel vostro UICollectionViewController sottoclasse, come ad esempio in viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.automaticallyAdjustsScrollViewInsets = NO; 
} 

ho messo un example project on GitHub che illustra questo problema e la soluzione. Ci sono due rami: with_error e fixed_error. Ecco un diff of the change on GitHub.

+1

bello - questo ha risolto il mio problema! – Ronaldoh1

+4

Avrei potuto farlo "su" due volte se potessi. Inoltre, NOTA che è possibile modificare 'automaticamenteAdjustsScrollViewInsets' direttamente in Interface Builder. – nikans

+1

Grazie! Ha funzionato :) –

1

ios 10: più in alto vista non è stato collegato alla presa di vista

1

Questo problema solo si è verificato a me su schermi 3x Come si è scoperto, il motore di layout automatico non ha davvero come infinita (vale a dire l'iPhone 6 Plus.) valori in virgola mobile (come .33333333), quindi la mia soluzione era di floor l'altezza di ritorno in sizeForItemAt:indexPath:.

return CGSize(width: preferredWidth, height: floor(preferredHeight)) 
Problemi correlati