用例:
- 我有一个
UICollectionView
要展示的产品,让我们称之为productsViewCollection
(只有一行有多个ProductCell
s)。 - 每个
ProductCell
可能有不同的高度,但它们都具有相同的宽度。 ProductCell
可以在运行时添加。- 我正在根据 s 使用自动调整大小的单元
AutoLayout
格ProductCell
。 我有
UICollectionViewFlowLayout
自定义类来使产品单元对齐顶部。class TopLayout : UICollectionViewFlowLayout { override func awakeFromNib() { super.awakeFromNib(); self.scrollDirection = .horizontal; } override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { let attributesArray = super.layoutAttributesForElements(in: rect); if attributesArray != nil { for attributes in attributesArray! { if (attributes.representedElementKind == nil) { let rect : CGRect? = self.layoutAttributesForItem(at: attributes.indexPath)?.frame; if (rect != nil) { attributes.frame = rect!; } } } } return attributesArray; } override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attributes = super.layoutAttributesForItem(at: indexPath); //let sectionInset : UIEdgeInsets = (self.collectionView?.collectionViewLayout as! UICollectionViewFlowLayout).sectionInset; if (indexPath.item >= 0) { attributes?.frame.origin.y = 0; } return attributes; }}
问题是什么?
- (1) 我没有找到确定高度的方法
productsCollectionView
。 - (2) 我没有找到强制
productsCollectionView
只显示一行的方法。 - (3)
ProductCell
在productsCollectionView
前导中插入一个新的滚动到第一个项目!,我需要将它保持在相同的位置。
我试过什么?
- 尝试问题(1):
- 确定没有高度的宽度是行不通的,因为我需要确定高度,
productsCollectionView
否则ProductCell
s 不会出现。 - 因此我尝试设置高度约束,但应用程序崩溃了
"The behavior of the UICollectionViewFlowLayout is not defined because the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values."
,productsCollectionView
没有插图(水平 UICollectionView 单行布局)。 - 我也尝试使用
collectionView.contentSize
高度约束来确定高度,productsCollectionView
但它不起作用,因为即使您调用layoutIfNeeded
或任何类似方法,它也不会具有最终计算的大小(如何使用 FlowLayout和许多其他链接确定 UICollectionView 的高度) . - 我也尝试使用
collectionView.collectionViewlayout.collectionViewContentSize
高度约束来确定高度,productsCollectionView
但它不起作用,它会正确计算宽度,而高度将根据AutoLayout
约束而不是最大ProductCell
高度来确定,所以我没有找到自动确定高度的方法(如何使用 FlowLayout和许多其他链接确定 UICollectionView 的高度)。 - 因此,最后我尝试根据
ProductCell
s 最大高度手动更改高度,我为 设置了更大的高度约束,productsViewCollection
并在MyViewController
我调用layoutAttributesForItem
了 中的每个项目productsViewCollection
来计算每个ProductCell
高度。 - 它起作用了,但是如果我需要插入任何其他产品,我应该做同样的事情,但这也会导致 UI 中的错误行为,
productsCollectionView
它将扩展几毫秒然后正确裁剪:(。
- 确定没有高度的宽度是行不通的,因为我需要确定高度,
- 尝试问题(2):
- 当然,我将其设置为水平,但这还不够,如果产品高度的总和小于
productsCollectionView
高度(在 UICollectionView - Swift 中显示一行),流程布局会将产品添加到同一列。 - 所以我尝试为
minimumInteritemSpacing
它设置更大的值,但不是 100% 正确,它会在最后添加额外的空间(UICollectionView: One Row 或 Column)。 - 我试图在方法中使用自定义类使
ProductCell
高度与高度相同,但它不起作用,高度改变了但同一列的单元格,我不知道为什么!productsCollectionView
UICollectionViewFlowLayout
layoutAttributesForItem
- 当然,我将其设置为水平,但这还不够,如果产品高度的总和小于
- 尝试问题(3):
- 我不知道为什么插入新项目会导致滚动,有时是第一个项目,有时是几个项目之前,有时它与奇怪的调整大小动画一起正常工作!无论如何,我试图禁用我的调整大小
productsCollectionView
代码,但什么也没发生。 - 我试图保存当前
productsCollectionView.contentOffset
然后应用它,它只有在我将animated
参数设置为时才有效true
,否则它将是未指定的滚动。
- 我不知道为什么插入新项目会导致滚动,有时是第一个项目,有时是几个项目之前,有时它与奇怪的调整大小动画一起正常工作!无论如何,我试图禁用我的调整大小
注意: 对不起,我的英语不好,谢谢。