UICollectionViewCell以内在大小展开/折叠

时间:2015-07-21 00:23:57

标签: ios autolayout uicollectionview

我有一个带有自定义流布局的集合视图,以及许多不同高度的不同单元格。集合视图的宽度在设备旋转时更改,因此单元格的宽度必须相应更改。为此,我实现了“sizeForItemAtIndex”方法,并根据当前的界面方向返回不同的大小。 大多数单元格不会改变它们的高度,但是,只要用户点击它,我就会想要展开和折叠一个单元格。您可以假设单元格只有一个带有一行或多行文本的UILabel。当单元格第一次出现时,行数设置为1,当用户点击单元格时,行数设置为0,此处单元格应使用标签的内在大小自动更改其高度。我怎样才能达到这个效果? 以下是它应该是什么样子的示例: enter image description here

2 个答案:

答案 0 :(得分:11)

请按照以下步骤操作:

1)。创建一个名为isExpanded的布尔变量来管理展开/折叠

2。)将目标和操作添加到show more按钮

[yourCellName.btnShowMore addTarget:self action:@selector(ShowMoreButtonClicked) forControlEvents:UIControlEventTouchUpInside];

3.)在sizeForItemAtIndexPath中管理高度,添加:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{

if (isExpanded && indexPath.row == 0) {
        return CGSizeMake(CGRectGetWidth(self.view.frame), calculated height for the expanded cell);
    }
   return CGSizeMake(CGRectGetWidth(self.view.frame), default height);
}

4.)然后在ShowMoreButtonClicked方法

- (void)ShowMoreButtonClicked{
    if (isExpanded) {
       isExpanded = FALSE;
       [collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]];

    }
    else {
       isExpanded = TRUE;
       [collection_viewCus reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]]];
   }}

5.)在cellForItemAtIndexPath

中添加此行
 [yourCellName layoutIfNeeded];

6。)Build&跑

答案 1 :(得分:2)

之前的回复很好,但如果你想要一些动画,你需要做三个步骤:

1.使您的collectionViewLayout无效

self.collectionView.collectionViewLayout.invalidateLayout()

2.Reroad desired indexPath或performBatchUpdates块中的所有数据

collectionView.performBatchUpdates({
            self.collectionView.reload(at: DESIRED_INDEXPATH)
        }, completion: nil)

3.返回以sizeForItemAtIndexpath委托方法

计算的新高度