2015-07-21 12 views
8

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: enter image description hereUICollectionViewCell espandi/comprimi con le dimensioni intrinseche

+0

Puoi aggiungere quello che hai provato finora e quali risultati che stai ricevendo? – MoMo

risposta

11

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

+0

Ben fatto, ho passato la notte scorsa a capire questo e ho detto "Risponderò domani" e boom, eccolo – MoMo

+0

C'è un modo per consentire al layout automatico di calcolare automaticamente l'altezza? – almas

+0

sì, restituisci questa dimensione per la cella: - CGSize CellSize = [yourCell systemLayoutSizeFittingSize: UILayoutFittingCompressedSize conHorizontalFittingPriority: UILayoutPriorityDefaultHigh verticalFittingPriority: UILayoutPriorityDefaultLow]; – Mihawk

1

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

Problemi correlati