UICollectionView Self Sizing Cells with Auto Layout

前端 未结 16 1955
野性不改
野性不改 2020-11-22 05:58

I\'m trying to get self sizing UICollectionViewCells working with Auto Layout, but I can\'t seem to get the cells to size themselves to the content. I\'m having

16条回答
  •  春和景丽
    2020-11-22 06:28

    I did a dynamic cell height of collection view. Here is git hub repo.

    And, dig out why preferredLayoutAttributesFittingAttributes is called more than once. Actually, it will be called at least 3 times.

    The console log picture :

    1st preferredLayoutAttributesFittingAttributes:

    (lldb) po layoutAttributes
     index path: ( 
    {length = 2, path = 0 - 0}); frame = (15 12; 384 57.5); 
    
    (lldb) po self.collectionView
    

    The layoutAttributes.frame.size.height is current status 57.5.

    2nd preferredLayoutAttributesFittingAttributes:

    (lldb) po layoutAttributes
     index path: ( 
    {length = 2, path = 0 - 0}); frame = (15 12; 384 534.5); 
    
    (lldb) po self.collectionView
    

    The cell frame height changed to 534.5 as our expected. But, the collection view still zero height.

    3rd preferredLayoutAttributesFittingAttributes:

    (lldb) po layoutAttributes
     index path: ( 
    {length = 2, path = 0 - 0}); frame = (15 12; 384 534.5); 
    
    (lldb) po self.collectionView
    

    You can see the collection view height was changed from 0 to 477.

    The behavior is similar to handle scroll:

    1. Before self-sizing cell
    
    2. Validated self-sizing cell again after other cells recalculated.
    
    3. Did changed self-sizing cell
    

    At beginning, I thought this method only call once. So I coded as the following:

    CGRect frame = layoutAttributes.frame;
    frame.size.height = frame.size.height + self.collectionView.contentSize.height;
    UICollectionViewLayoutAttributes* newAttributes = [layoutAttributes copy];
    newAttributes.frame = frame;
    return newAttributes;
    

    This line:

    frame.size.height = frame.size.height + self.collectionView.contentSize.height;
    

    will cause system call infinite loop and App crash.

    Any size changed, it will validate all cells' preferredLayoutAttributesFittingAttributes again and again until every cells' positions (i.e frames) are no more change.

提交回复
热议问题