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 子类化——但我不确定。
感谢任何帮助!
您无法使用约束来实现此目的,但您可以使用 UICollectionViewDelegate
的 sizeForItemAtIndexPath
方法轻松实现。示例:
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 种方法:
- 在您的 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;
}
- 如果这不起作用,那么我 100% 确定如果您子类化 collectionView 并插入相同的代码但在
(void)layoutSubviews
中它会起作用
在UICollectionViewDelegateFlowLayout
sizeForItemAt
方法中设置单元格高度并获取集合视图高度。您可以根据整数设置单元格大小,如果更合适,也可以乘以百分比。
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)
}
我在 CollectionView 中放置了一个 CollectionViewCell。 CollectionView 的大小是通过自动布局设置的,有时会发生变化。
我想(以编程方式)在我的 CollectionView 上设置约束,以便 CollectionViewCell 的大小响应 CollectionView 的大小(假设 Cell 的宽度等于 CollectionView-100 的宽度并且高度应该相等)。
如何在 Cell 和 CollectionView 之间声明约束?
何时、何地以及如何设置这些约束?当 CollectionView 的大小发生变化时,是否必须在 Cell 上调用 setNeedsLayout?
我搜索了很长时间,但我发现的总是关于根据内容更改单元格的大小——这不是我想要做的。我得到的唯一提示是我可能必须将 CollectionViewLayout 子类化——但我不确定。
感谢任何帮助!
您无法使用约束来实现此目的,但您可以使用 UICollectionViewDelegate
的 sizeForItemAtIndexPath
方法轻松实现。示例:
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 种方法:
- 在您的 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;
}
- 如果这不起作用,那么我 100% 确定如果您子类化 collectionView 并插入相同的代码但在
(void)layoutSubviews
中它会起作用
在UICollectionViewDelegateFlowLayout
sizeForItemAt
方法中设置单元格高度并获取集合视图高度。您可以根据整数设置单元格大小,如果更合适,也可以乘以百分比。
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)
}