2012-11-10 4 views
12

ho vista insieme con varie dimensioni degli elementi che dichiaro inUICollectionView: diversi articoli di formato non è calcolato su oggetti riutilizzati

- (CGSize)collectionView:(UICollectionView *)collectionView 
        layout:(UICollectionViewLayout*)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 

    FeedItem *item = [_imagesLinkArray objectAtIndex:indexPath.row]; 
    return CGSizeMake(250, 200*item.sizeFactor); 
} 

Quando la cella viene riutilizzato in collectionView:cellForItemAtIndexPath: l'articolo è stato reso con il dimensione dell'elemento riutilizzabile e non quella specificata in sizeForItemAtIndexPath:.

qualche idea?

+0

Potrebbe condividere il tuo CollectionView: cellForItemAtIndexPath: metodo? Inoltre, è possibile che una delle sottoview all'interno della tua cella venga ridimensionata indipendentemente dalla cella facendolo apparire come se la cella non venisse ridimensionata? – robhasacamera

+0

Qualche progresso su questo? sizeForItemAtIndexPath: non viene ricalcolato quando si scorre e le celle vengono riutilizzate. – Abdo

+0

Ho lo stesso problema quando scorro verso il basso le celle ottengono allineamenti diversi (come perdere lo spazio minimo tra le celle) – Qwin

risposta

3

Una vista di raccolta sembra ricalcolare gli articoli meno spesso di uno UITableView. Devi informare la vista dell'insieme sulla maggior parte delle modifiche al modello sottostante, ad es. chiamando lo [collectionView reloadData] o [collectionView insertItemsAtIndexPaths:indexPaths].

+1

Questa risposta mi ha indirizzato nella giusta direzione. Chiamare 'reloadData' prima di restituire' CGSize' alla 'collectionView: layout: sizeForItemAtIndexPath' ha reso la magia! Grazie! –

+0

Come viene propagato alla cella? –

5

Sembra che collectionView:layout:sizeForItemAtIndexPath: venga chiamato una volta nella preparazione del layout, prima che CollectionView sia reso.

Così ogni volta che si scorre e una cella viene rimossa dalla coda, viene ridimensionata alla dimensione fornita da collectionView:layout:sizeForItemAtIndexPath: in fase di preparazione. Ti aspetti che questo metodo venga chiamato ogni volta che una cella con determinati IndexPath diventa visibile? In modo che tu possa modificare dinamicamente la dimensione della cella? sembra che questo non sia il modo in cui questo metodo può essere usato, può essere usato per determinare la dimensione di una cella una volta nella fase di preparazione del layout.

Nel caso in cui sia necessario ricalcolare le dimensioni per qualche motivo, è possibile invalidare il layout utilizzando [UICollectionViewLayout invalidateLayout].

0

È necessario Override questa funzione nella classe di layout personalizzata. se si utilizza il layout personalizzato.

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { 
return true 
} 
0

È possibile semplice sostituzione del rotolo vista delegato

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    collectionView.collectionViewLayout.invalidateLayout() 
}