2015-06-29 7 views
17

Ich habe eine einfache UICollectionView mit einem UICollectionViewFlowLayout, das Auto-Layout verwendet, um selbst-Sizing-Zellen zu ermöglichen. Dinge funktionieren hervorragend in einem statischen Layout, aber wenn ich Zellen einfügen oder entfernen, die Größe der Zellen auf die geschätzte Größe:UICollectionView mit Self-Sizing-Zellen ändert die Größe der Zellen beim Einfügen/Entfernen Animation

[self.collectionView performBatchUpdates:^{ 
    [self.collectionView insertItemsAtIndexPaths:@[indexPath]]; 
} completion:nil]; 

Über die geschätzte Größe, wie diese Einstellung:

layout.estimatedItemSize = CGSizeMake(88.0, 88.0); 

Ich bin in der Sammlungsansicht nichts Besonderes machen. Alles wird mithilfe von Storyboards eingerichtet.

Wie kann ich diese Größenänderung vermeiden? Ich bin nur auf iOS 8.0 und höher ausgerichtet, sodass es unterstützt werden sollte.

example of the problem

+4

Haben Sie es geschafft, dieses Problem zu beheben? Ich habe genau das gleiche Problem! – Peymankh

+0

Nein, Entschuldigung. Ich werde wieder in den Apple Foren fragen. Auf iOS 9 stürzt es einfach ab, also muss ich etwas verpassen. – Senior

+0

Ich bemerkte dies, nachdem ich ein ähnliches Problem von mir selbst aufgeworfen hatte: http://stackoverflow.com/questions/34045566/uicollectionview-cells-resizing-with-deleting-items-with-estimateditemsize. Hast du eine Lösung gefunden? –

Antwort

0

Eine straightfoward Lösung ist die UICollectionViewDelegateFlowLayout Methode

func collectionView(_ collectionView: UICollectionView, layoutcollectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     // calculate string size here 
} 

Und nach dem Einfügen oder Löschen von Zellen zu implementieren stellen Sie sicher, Layout ungültig, so dass delegierte Methode erneut aufgerufen wird

collectionView.performBatchUpdates({ 
    // insert/delete items here 
}) { (success: Bool) in 
    collectionView.collectionViewLayout.invalidateLayout() 
} 
0
  1. Set estimatedItemSize Grundstück zu einer angemessenen Größe.

  2. In Ihrer benutzerdefinierten Klasse überschreiben Methode und Cache layoutAttributes Größe von Super gegeben.

    -(UICollectionViewLayoutAttributes*)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 
    { 
        UICollectionViewLayoutAttributes * superAttr = [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; 
        //Cache size which is returned by super (superAttr.frame.size) since super calculates the correct size for auto size cells. 
        return superAttr; 
    } 
    

3.In sizeForItemAtIndexPath verfügbar sonst geschätzte Größe, wenn Größe im Cache zurückzukehren.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //return cached size if available else the estimated size 
} 
Verwandte Themen