CollectionViewCell 相对于 CollectionView 的自动布局大小

Auto Layout size of CollectionViewCell in relation to CollectionView

我在 CollectionView 中放置了一个 CollectionViewCell。 CollectionView 的大小是通过自动布局设置的,有时会发生变化。

我想(以编程方式)在我的 CollectionView 上设置约束,以便 CollectionViewCell 的大小响应 CollectionView 的大小(假设 Cell 的宽度等于 CollectionView-100 的宽度并且高度应该相等)。

如何在 Cell 和 CollectionView 之间声明约束?

何时、何地以及如何设置这些约束?当 CollectionView 的大小发生变化时,是否必须在 Cell 上调用 setNeedsLayout?

我搜索了很长时间,但我发现的总是关于根据内容更改单元格的大小——这不是我想要做的。我得到的唯一提示是我可能必须将 CollectionViewLayout 子类化——但我不确定。

感谢任何帮助!

您无法使用约束来实现此目的,但您可以使用 UICollectionViewDelegatesizeForItemAtIndexPath 方法轻松实现。示例:

func collectionView(collectionView: UICollectionView, 
       layout collectionViewLayout: UICollectionViewLayout,
  sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.size.width / 2, height: collectionView.frame.size.height/ 2)
}

更改 collectionView 大小后,您需要做的就是调用其 reloadData 方法。

我可以为您推荐 2 种方法:

  1. 在您的 UIViewController 中尝试在 viewDidLayoutSubviews 方法中设置 collectionViewLayout 属性。我不确定当屏幕方向改变时它是否有效。
- (void)viewDidLayoutSubviews
{
  UICollectionViewFlowLayout *flow  = YOUR_COLLECTION_VIEW.collectionViewLayout;
  float width = CGRectGetWidth(YOUR_COLLECTION_VIEW.frame)-100.f;
  float height = CGRectGetHeight(YOUR_COLLECTION_VIEW.frame);
  YOUR_COLLECTION_VIEW.collectionViewLayout = flow;
}
  1. 如果这不起作用,那么我 100% 确定如果您子类化 collectionView 并插入相同的代码但在 (void)layoutSubviews
  2. 中它会起作用

UICollectionViewDelegateFlowLayoutsizeForItemAt方法中设置单元格高度并获取集合视图高度。您可以根据整数设置单元格大小,如果更合适,也可以乘以百分比。

func collectionView(_ collectionView: UICollectionView, layout 
collectionViewLayout: UICollectionViewLayout, sizeForItemAt 
indexPath: IndexPath) -> CGSize {
        let heigh = collectionView.frame.height
        let widthOfCell = collectionView.frame.width - 100 // OP request
        return CGSize(width: width, height: height) 
}