Ho una vista di raccolta con un layout di flusso personalizzato e molte celle diverse di altezza diversa. La larghezza della vista di raccolta cambia in base alla rotazione del dispositivo, pertanto la larghezza delle celle deve essere modificata di conseguenza. Perché funzioni, ho implementato il metodo "sizeForItemAtIndex" e restituisco diverse dimensioni a seconda dell'orientamento dell'interfaccia corrente. La maggior parte delle celle non modifica la loro altezza, tuttavia, c'è una cella che voglio espandere e comprimere ogni volta che l'utente lo tocca. Puoi supporre che la cella abbia solo un UILabel con una o più righe di testo. Quando la cella viene visualizzata per la prima volta, il numero di linee è impostato su 1 e quando l'utente tocca la cella il numero di linee è impostato su 0, e qui la cella deve utilizzare la dimensione intrinseca dell'etichetta per cambiare automaticamente l'altezza . Come posso ottenere questo effetto? Ecco un esempio di quello che dovrebbe essere simile: UICollectionViewCell espandi/comprimi con le dimensioni intrinseche
risposta
procedere come segue:
1). Creare una variabile booleana denominata isExpanded
per gestire espansione/compressione
2.) Aggiungi un bersaglio e di azione per lo spettacolo più tasto
[yourCellName.btnShowMore addTarget:self action:@selector(ShowMoreButtonClicked) forControlEvents:UIControlEventTouchUpInside];
3.) In sizeForItemAtIndexPath per la gestione di altezza, aggiungere:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (isExpanded && indexPath.row == 0) {
return CGSizeMake(CGRectGetWidth(self.view.frame), calculated height for the expanded cell);
}
return CGSizeMake(CGRectGetWidth(self.view.frame), default height);
}
4.) Quindi nel metodo ShowMoreButtonClicked
- (void)ShowMoreButtonClicked{
if (isExpanded) {
isExpanded = FALSE;
[collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]];
}
else {
isExpanded = TRUE;
[collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]];
}}
5.) Aggiungi questa linea nel vostro cellForItemAtIndexPath
[yourCellName layoutIfNeeded];
6.) costruire & run
Ben fatto, ho passato la notte scorsa a capire questo e ho detto "Risponderò domani" e boom, eccolo – MoMo
C'è un modo per consentire al layout automatico di calcolare automaticamente l'altezza? – almas
sì, restituisci questa dimensione per la cella: - CGSize CellSize = [yourCell systemLayoutSizeFittingSize: UILayoutFittingCompressedSize conHorizontalFittingPriority: UILayoutPriorityDefaultHigh verticalFittingPriority: UILayoutPriorityDefaultLow]; – Mihawk
La risposta precedente è buona, ma se volete un po 'di animazione è necessario fare questo tre fasi:
1.Invalidate tua collectionViewLayout
self.collectionView.collectionViewLayout.invalidateLayout()
2.Reload desiderato indexPath o tutti i dati all'interno di un blocco performBatchUpdates
collectionView.performBatchUpdates({
self.collectionView.reload(at: DESIRED_INDEXPATH)
}, completion: nil)
3.Return la nuova altezza calcolato metodo sizeForItemAtIndexpath
delegato
Puoi aggiungere quello che hai provato finora e quali risultati che stai ricevendo? – MoMo