10

(EDIT: sembra funzionare bene a cominciare iOS 9 Non ho fatto prove approfondite, ma l'esempio funziona Ciò conferma il bug presente in iOS 8...)UicollectionViewFlowLayout's stimatoItemSize interrompe lo scorrimento?

ho speso un sacco di tempo testando il comportamento di dimensionamento del layout del flusso di UICollectionView. Dopo un sacco di frustrazione, il problema si riduce al fatto che non appena uno imposta estimatedItemSize su una dimensione diversa da zero, lo scorrimento non funziona più correttamente.

Nel mio esempio invece di mostrare 40 elementi vengono visualizzati solo 32.

ho copia incollato il codice qui sotto. Ho provato molte cose a partire da una versione Swift.

Fondamentalmente si riesce a calcolare e/o adeguatamente aggiornare il layout di collectionViewContentSize()

Ecco una demo completa http://git.io/AIrHNA

Qualcuno mi può puntare nella giusta direzione?

Grazie

@implementation ViewControllerObjcC 

static NSString * const reuseIdentifier = @"Cell"; 
-(UICollectionViewFlowLayout*)flowLayout{ 
    return (UICollectionViewFlowLayout*)self.collectionViewLayout; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 
    CGSize estimatedSize = CGSizeMake(self.view.frame.size.width, 25.0); 
    BOOL testEstimatedItemSize = true; 
    if (testEstimatedItemSize) { 
    [self flowLayout].estimatedItemSize = estimatedSize; 
    }else{ 
    [self flowLayout].itemSize = estimatedSize; 
    } 

} 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
    return 1; 
} 
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return 40; 
} 
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 
    UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)]; 
    [cell.contentView addSubview:label]; 
    label.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row]; 
    label.backgroundColor = [UIColor redColor]; 
    return cell; 
} 
+9

Sono sorpreso di sentire che siete stati in grado di usare 'estimateItemSize' affatto. Nella mia esperienza, tutto ciò che accade quando lo uso è che mi schianto.La mia conclusione è che questa funzionalità di auto-dimensionamento delle celle, benché pubblicizzata nei video del WWDC 2014, non è mai arrivata online. Quindi il mio consiglio è: non provare a utilizzare questa funzione, basta tornare a misurare le dimensioni degli oggetti "a mano" come abbiamo fatto in iOS 7, e starai bene. (Naturalmente sarei lieto di sapere che mi sbaglio su questo e che ha iniziato a funzionare ...) – matt

+0

Matt, grazie per il tuo prezioso consiglio. Stavo pensando esattamente a quello che mi stai dicendo mentre scrivi il post iniziale. Indipendentemente da ciò, è frustrante per me passare tutto questo tempo alla ricerca di questo problema, pubblicizzato come risolto al WWDC. Come accennato, ho ristretto il problema a un semplice esempio e sono disposto a scavare fino in fondo. Spero di perdere qualcosa e qualcuno mi aiuterà a vederlo. – Adrian

risposta

0

Dalla documentazione:

Il valore predefinito di questa proprietà è CGSizeZero. Impostandolo su qualsiasi altro valore , la vista di raccolta interroga ogni cella per la sua dimensione effettiva utilizzando il metodo preferredLayoutAttributesFittingAttributes:10 della cella. Se tutte le celle hanno la stessa altezza, utilizzare la proprietà itemSize anziché la proprietà per specificare la dimensione della cella.

Sembra che tu non utilizzi questo metodo preferredLayoutAttributesFittingAttributes: nel tuo progetto ?, hai provato a implementarlo?

D'altra parte, questa soluzione sembra buono: Specifying one Dimension of Cells in UICollectionView using Auto Layout

1

Da Apple's Document,

In particolare, le cellule che non sono sullo schermo sono presume di essere l'altezza stimata.

Questa è la mia ipotesi.

Quando l'altezza stimata è inferiore all'altezza effettiva della cella, la previsione della dimensione del contenuto della vista di raccolta è inferiore alla dimensione del contenuto effettivo.

Pertanto visualizza solo 32 delle 40 celle totali.

Nel mio progetto, tutti i file vengono visualizzati quando viene utilizzata una grande dimensione stimata.

Problemi correlati