2014-08-29 14 views
7

Ho impostato un UICollectionView (con il layout di flusso predefinito e lo scorrimento verticale) con celle personalizzate che vengono caricate da uno xib. Le celle contengono un paio di elementi (uno UILabel e uno UIView) con vincoli su di essi. Ho installato i vincoli in modo tale che l'altezza della cella cresce come il testo dell'etichetta altezza aumenta utilizzando il nuovo UICollectionViewFlowLayout proprietà che è disponibile in iOS 8, estimatedItemSize:Scorrimento verticale UICollectionView con celle di auto-dimensionamento visualizza solo metà delle celle

layout.estimatedItemSize = CGSizeMake(self.collectionView.frame.width, 100) 

Tutto funziona come un fascino tranne c'è un grosso problema : lo UICollectionView carica solo la metà degli articoli restituiti dal metodo numberOfItemsInSection. Quindi, quando il metodo restituisce, ad esempio, 10, il mio UICollectionView visualizza solo 5 celle (ma le visualizza e le espone perfettamente).

Alcuni risultati rilevanti i miei tentativi di debug:

  • sono stato in grado di forzare il caricamento degli elementi rimanenti chiamando invalidateLayout o modificando il numero di sezioni da 1 a 2. Ma questi sono solo il debug hack.
  • Separatamente, tutto funziona come un incantesimo quando sostituisco estimatedItemSize con la proprietà itemSize, ad esempio hard-coding della dimensione dell'elemento. Ma ciò sconfigge la funzionalità di auto-ridimensionamento che vorrei implementare.

Suppongo che ci sia qualcosa di sbagliato nel modo in cui sto pensando alle celle autonome. In particolare, mi chiedo se il problema abbia qualcosa a che fare con i vincoli.

Apprezzerei qualsiasi aiuto qui.

+0

Aggiornamento rapido: questo sembra essere un artefatto di bug più pervasivi (o forse scopriremo che sono semplicemente dettagli di implementazione bizzarri) di auto- dimensionamento delle celle in UITableViews e UICollectionViews. Non sono riuscito a presentare un radar contro l'auto-dimensionamento UICV, ma ne ho messo uno per UITableView - https://github.com/rainypixels/SelfSizingCells – rainypixels

risposta

2

La soluzione non hacky ovvia è quella di implementare

flowLayout.collectionView(layout:sizeForItemAtIndexPath:) 

ma, naturalmente, che è più codice di quello che presumibilmente hanno sperato.

Vorrei suggerire di provare altre due cose:

  1. provare a sperimentare con i formati stima più plausibili. Prova anche il valore predefinito, CGSizeZero.
  2. Controllare cosa succede in preferredlLayoutAttributesFittingAttributes() esaminando il parametro layoutAttributes. Forse trovi un indizio sul motivo per cui le altre celle sono "affollate".
+0

Grazie, Mundi. Sì, hai ragione che 'sizeForItemAtIndexPath' potrebbe sconfiggere lo scopo qui. Ho dato a entrambi i tuoi suggerimenti uno sparo. Variare "CGSize" per avere una larghezza inferiore alla larghezza della collezioneView non cambia le cose; le celle arrivano a una larghezza minore e si dispongono come ci si aspetterebbe da un layout di flusso. Tutto sembra in ordine in 'layoutAttributes', anche. Detto questo, si sta verificando un affollamento perché la larghezza della proprietà 'contentsize' di UICollectionView è maggiore di 320pt (sto testando per iPhone in questo momento). – rainypixels

+0

Oh, ho passato un po 'di tempo ad esplorare i forum di iOS Dev e, anche se non ci sono molte informazioni sulle celle 'UICollectionView' di auto-dimensionamento, i due thread correlati potrebbero trovare dei problemi con l'implementazione della funzione. Questo potrebbe benissimo essere un bug beta con l'implementazione. – rainypixels

+0

Ciò che ha funzionato per me era impostare la dimensione stimata in CGSizeZero. Ho provato una dimensione stimata "ragionevole" e cambiando dinamicamente la dimensione stimata e nessuno dei due ha aiutato. – Rob

1

In una sottoclasse personalizzata di UICollectionViewFlowLayout

esclusione prepareLayout in questo modo:

- (void)prepareLayout { 
    [super prepareLayout]; 
    CGSize contentSize = self.collectionView.contentSize; 

    // Without this line, the scrolling doesn't go all the way to the bottom, right away but takes a while 
    [super layoutAttributesForElementsInRect:CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height)]; 
} 
+0

Questo sembra aiutare un po 'ma non risolve completamente il problema. Anche con questo incontriamo ancora lo stesso bug. Ad esempio, abbiamo trovato su alcune viste di raccolta che ha aiutato su un dispositivo, ma poi quando abbiamo testato su un'altra dimensione dello schermo l'errore si verificava ancora. – ToddH

0

Ho avuto questo problema esattamente lo stesso. Stavo usando layout.estimatedItemSize = CGSizeMake(373.0, 500.0) insieme

preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes! 

e ho ottenuto esattamente il comportamento auto-sizing che volevo, tranne che stavo ottenendo soltanto la metà delle cellule visualizzati. La cosa curiosa è quando ho cambiato la proprietà preventivataItemSize su: layout.estimatedItemSize = view.bounds.size TUTTE le celle appaiono !! Spero che questo aiuti. In bocca al lupo.

+1

Qual è la variabile 'view' nel tuo esempio? UICollectionView? –

3

Credo che ciò sia dovuto a un bug in iOS8 che esiste ancora a partire da iOS8.3.

Le viste di raccolta del layout di flusso con celle auto dimensionanti non visualizzeranno parte del loro contenuto se lo estimatedItemSize è troppo piccolo. Questo nonostante il fatto che, in base ai documenti API, l'unico requisito per lo estimatedItemSize è che non sia zero per attivare il comportamento di auto-ridimensionamento.

Solo Apple è in grado di risolvere questo problema. Penso che la soluzione migliore nel frattempo sia quella di inserire un valore gonfiato in stimeItemSize`.

Questo repo illustra il problema: https://github.com/algal/SelfSizingCellsDemo. (Ho archiviato un radar su rdar: // 18078598.)

+0

Ci siamo solo imbattuti mentre tentavo di supportare iOS8. Ero sconcertato perché le mie cellule stavano scomparendo sul mio dispositivo iOS8 e non sul mio dispositivo iOS9. Un bug del sistema operativo molto stupido. Grazie! – Archagon

+1

(Notare, tuttavia, che l'impostazione di SizeItemSize su qualcosa di troppo grande farà sobbalzare l'indicatore di scorrimento mentre si sta scorrendo per la prima volta.) – Archagon

+1

Ho ancora questo su ios9 –

Problemi correlati