2015-11-18 16 views
7

I utilizzare la funzione di ridimensionamento automatico layout di flusso di CollectionViewCome rendere una dimensione automatica della raccoltaViewCell solo in base all'altezza?

self.flow = [[UICollectionViewFlowLayout alloc] init]; 
self.flow.scrollDirection = UICollectionViewScrollDirectionVertical; 
self.flow.sectionInset = UIEdgeInsetsZero; 
self.flow.estimatedItemSize = CGSizeMake(320, 48); 

voglio cellule riempirà con larghezza piena di CollectionView (widthCell = widthCollectionView)

ma ho ottenuto quello ridimensionamento automatico di lavoro per tutta la dimensione. Provo a giocare con Content Compression/Hugging Priority - non effetto.

Con larghezza di CollectionView equivale a 320 px, ho ottenuto la dimensione della cella per le dimensioni del contenuto dell'etichetta.

La mia cella assomiglia enter image description here

Vincoli orizzontale: H: | -8- [img (48)] - 8- [etichetta] -8- |

Come rendere automatico il lavoro solo per verticale ma non orizzontale?

+0

ho risposto, funziona bene http://stackoverflow.com/a/31604233/3382056 – Mihawk

+0

Mihawk, non è un esempio autosize. Anche in questo esempio lo uso, ma mi chiedo autosize. –

+0

questa soluzione è per il caricamento automatico – Mihawk

risposta

10

Ho trovato una soluzione.

CollectionViewCell ha un delegato preferredLayoutAttributesFittingAttributes

Quindi, questa funzione dà u layoutAttributes set come estimatedItemSize

È necessario fare dopo (per altezza)

- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { 
    UICollectionViewLayoutAttributes *attr = [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; //Must be called 
    CGRect frame = attr.frame; 
    frame.size.width = layoutAttributes.size.width; //Key here 
    attr.frame = frame; 
    return attr; 
} 

Same u può fare a preferire dimensioni, larghezza quindi fai un'altezza costante (frame.size.height = layoutAttributes.size.height).

Se si copia semplicemente layoutAttributes e si modifica larghezza, non avrà alcun effetto!

U deve chiamare super.

+0

Salvato il mio giorno!Grazie! – hyouuu

+0

Come si usa? Dove imposti quel delegato? – RedRoses

3

In realtà, ecco il problema con la priorità dei vincoli.

per risolvere il problema vincolo prioritario è necessario aggiornare il imageView Leading priority999 e anche label Trailing priorità 999 livello di programmazione o direttamente da Interface Builder.

Aggiorna priorità a livello di programmazione utilizzando lo KVConstraintExtensionsMaster che ho implementato per aggiornare qualsiasi vincolo senza IBOutlet reference del vincolo di Autolayout.

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell1" forIndexPath:indexPath]; 

    [cell.imageView changeAppliedConstraintPriority:999 forAttribute:NSLayoutAttributeLeading]; 
    [cell.label changeAppliedConstraintPriority:999 forAttribute:NSLayoutAttributeTrailing]; 

    return cell; 
} 

Dopo questa Ora è necessario calcolare l'unica altezza della cella

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat width = CGRectGetWidth(collectionView.bounds); 
    CGFloat height = /* do here some calculation for height */ 
    return CGSizeMake(width, height);; 
} 
+0

U utilizzare sizeForItemAtIndexPath, ma autoSize è senza calcolo manuale. –

+0

ovviamente autoSize sia per larghezza che per altezza e, ma si desidera riempire celle per larghezza a larghezza intera di CollectionView (widthCell = widthCollectionView). Quindi qui la larghezza della cella è sempre uguale alla larghezza della collectionView. –

-1

s' Dmitry Nelepov soluzione rapida.

Swift 4

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { 
    let attr = super.preferredLayoutAttributesFitting(layoutAttributes) 
    var frame = attr.frame 
    frame.size.width = layoutAttributes.size.width //Key here 
    attr.frame = frame 
    return attr 
}