2015-06-29 25 views
17

我有一個UICollectionViewFlowLayout的簡單UICollectionView,它使用自動佈局來允許自定義大小的單元格。事情在靜態佈局工作的偉大,但是當我插入或取出的細胞,細胞的大小調整爲估計大小:UICollectionView具有自動調整大小的細胞在插入/移除動畫期間調整大小

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

除了設置估計的大小,類似這樣的:

layout.estimatedItemSize = CGSizeMake(88.0, 88.0); 

我在收集視圖中不做任何事情。一切都是使用故事板設置的。

我該如何避免這種調整大小?我只針對iOS 8.0,因此應該支持。

example of the problem

+4

您是否設法解決此問題?我有完全相同的問題! – Peymankh

+0

不,對不起。我會在蘋果論壇上再次提問。在iOS 9上,它只是徹底崩潰,所以我必須錯過一些東西。 – Senior

+0

在提出我自己的類似問題後,我注意到了這一點:http://stackoverflow.com/questions/34045566/uicollectionview-cells-resizing-when-deleting-items-with-estimateditemsize。你有沒有設法找到解決方案? –

回答

0

的straightfoward解決方案是實現UICollectionViewDelegateFlowLayout方法

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

和插入或刪除單元格後,請務必佈局無效,這樣的委託方法又被稱爲

collectionView.performBatchUpdates({ 
    // insert/delete items here 
}) { (success: Bool) in 
    collectionView.collectionViewLayout.invalidateLayout() 
} 
0
  1. 設置estimatedItemSize財產一些適當的大小。

  2. 在您的自定義UICollectionView類覆蓋方法和緩存layoutAttributes的大小由super給出。如果有其他人估計大小

    -(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返回緩存的大小。

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