12

Come posso cambiare la dimensione di un UICollectionViewCell in base alla dimensione delle sue sottoview, usando Auto Layout?Come rendere UICollectionViewCell adatto alle sue sottoview (usando Auto Layout)

I miei UICollectionViewCell s hanno ciascuno solo una vista nel loro contentView. Si tratta di una sottoclasse personalizzata di UIView che si ridimensiona automaticamente per adattarsi a tutte le sue sottoview utilizzando Auto Layout. Implementa anche -intrinsicContentSize correttamente. Comunque lo UICollectionView, o meglio il suo layout, non sembra preoccuparsene.

Sto usando un UICollectionViewFlowLayout, e provato:

  • Lasciando la itemSize al suo valore di default. Questo mi dà celle con una dimensione di 50 x 50.
  • Implementazione del metodo delegato -collectionView:layout:sizeForItemAtIndexPath:. Tuttavia, quando viene chiamato questo metodo, le celle (ovviamente) non sono ancora apparse sullo schermo e non sono state aggiornate dal sistema di layout automatico.

C'è un modo per modificare le dimensioni delle mie celle in base alle loro sottoview utilizzando le classi Apple standard? O devo implementare la mia sottoclasse UICollectionViewLayout o qualcos'altro?

+0

Lo stesso principio di http://stackoverflow.com/questions/18477220/have-uitableviewcell-resize-itself-with-autolayout/18481179#18481179, è necessario dare la dimensione in anticipo, purtroppo. – jrturton

+1

L'autore sopra ha un commento sull'utilizzo di una cella "gratuita" - una che si crea e poi si tiene in giro, per popolare e quindi ottenere la dimensione di. Dovresti essere in grado di usare [cell systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] - Ora sto avendo problemi, ma uno di questi dovrebbe funzionare. –

risposta

-2

Prova CollectionView: Layout: sizeForItemAtIndexPath:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return self.view.frame.size; 
} 
0

ho usato

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.row == 0) { 
     UIButton *button = (UIButton *)[cell viewWithTag:2]; 
     CGRect frame = cell.frame; 
     frame.size.width = button.frame.size.width; 
     cell.frame = frame; 
    } 

} 

ed è stato in grado di ridimensionare mia cella in base alla larghezza del pulsante visualizzazione secondaria in una piccola applicazione di prova.

Assicurarsi che i tag sulle visualizzazioni secondarie siano maggiori di 0 perché se si utilizza 0, si torna indietro a contentView. Oltre a questo, questo dovrebbe arrivare lì

1

Hai provato questo:

[self.view layoutIfNeeded]; 
[UIView animateWithDuration:0.5 animations:^{ 
    constraintConstantForWidth.constant = subviews.size.width; 
    constraintConstantForHeight.constant = subviews.size.height; 
    [self.view layoutIfNeeded]; 
}]; 

e rendere la priorità del vincolo (basso = 250)

Penso che questo problema siamo in grado di gestire da la sostituzione costante del vincolo.