如何使UICollectionViewCell适合其子视图(使用自动布局)

时间:2013-08-30 07:16:56

标签: ios objective-c uicollectionview autolayout uicollectionviewcell

如何使用自动布局更改基于其子视图大小的UICollectionViewCell的大小?

我的UICollectionViewCell每个contentView只有一个视图。这是我的自定义UIView子类,它使用自动布局自动调整自身大小以适应其所有子视图。它还正确地实现了-intrinsicContentSize。然而,UICollectionView,或者说它的布局,似乎并不关心这一点。

我使用的是UICollectionViewFlowLayout,并尝试过:

  • itemSize保留为默认值。这使我的细胞大小为50 x 50。
  • 实施委托方法-collectionView:layout:sizeForItemAtIndexPath:。但是,当调用此方法时,单元格(显然)尚未出现在屏幕上,并且尚未被自动布局系统更新。

有没有办法根据使用标准Apple类的子视图更改单元格的大小?或者我是否必须实现自己的UICollectionViewLayout子类或其他什么?

3 个答案:

答案 0 :(得分:1)

你试过这个:

[self.view layoutIfNeeded];
[UIView animateWithDuration:0.5 animations:^{
     constraintConstantForWidth.constant = subviews.size.width;
     constraintConstantForHeight.constant = subviews.size.height;
     [self.view layoutIfNeeded];
}];

并使约束的优先级(低= 250)

我认为这个问题我们可以通过约束常量替换来处理。

答案 1 :(得分:0)

我用过

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0) {
        UIButton *button = (UIButton *)[cell viewWithTag:2];
        CGRect frame = cell.frame;
        frame.size.width = button.frame.size.width;
        cell.frame = frame;
    }

}

并且可以在一个小测试应用程序中根据按钮子视图的宽度调整我的单元格大小。

确保子视图上的标记大于0,因为如果使用0,它只会返回contentView。除此之外,这应该让你到那里

答案 2 :(得分:-2)

尝试 collectionView:layout:sizeForItemAtIndexPath:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return self.view.frame.size;
}