自我调整水平UICollectionView单行布局的大小 - 不是单元格

时间:2017-12-07 15:37:41

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewflowlayout

使用案例

  • 我有UICollectionView来展示产品,我们称之为productsViewCollection(只有一行有多个ProductCell)。
  • 每个ProductCell可能有不同的高度,但它们都具有相同的宽度。
  • ProductCell可能会在运行时添加。
  • 我使用的是自行调整大小的单元格,具体取决于AutoLayout的{​​{1}}。
  • 我有ProductCell自定义类,可以使产品单元格对齐。

    UICollectionViewFlowLayout

有什么问题?

  • (1)我找不到确定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; }} 的高度的方法。
  • (2)我没有办法迫使productsCollectionView只显示一行。
  • (3)将新productsCollectionView插入ProductCell导致滚动到第一项!我需要将其保持在同一位置。

我尝试了什么?

  • 尝试问题(1):
    • 确定没有高度的宽度不起作用,因为我需要确定productsCollectionView的高度,否则productsCollectionView将不会出现。
    • 因此我尝试设置高度限制,但应用已崩溃ProductCell"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."没有插入内容(Horizontal UICollectionView single row layout)。
    • 我还尝试使用productsCollectionView高度约束来确定collectionView.contentSize的高度,但它不起作用,因为即使您调用了productsCollectionView,它也不会有最终的计算大小或任何类似的方法(How to determine height of UICollectionView with FlowLayout和许多其他链接)。
    • 我还尝试使用带有高度约束的layoutIfNeeded来确定collectionView.collectionViewlayout.collectionViewContentSize的高度,但它不起作用,它将正确计算宽度,同时根据{{确定高度1}}约束不依赖于最大productsCollectionView高度,因此我没有找到自动确定高度的方法(How to determine height of UICollectionView with FlowLayout和许多其他链接)。
    • 因此,最后我尝试手动更改高度,具体取决于AutoLayout s最大高度,我为ProductCell设置了更大的高度约束,并在ProductCell中调用{{1} {}为productsViewCollection中的每个项目计算每个MyViewController高度。
    • 它有效,但如果我需要插入任何其他产品,我应该做同样的事情,但这也导致UI中的错误行为,layoutAttributesForItem将扩展几毫秒然后正确裁剪:(
  • 尝试问题(2):
    • 当然我将其设为水平但这还不够,流量布局会将产品添加到同一列,以防产品高度的总和小于productsViewCollection高度(Display one row in UICollectionView - Swift)。
    • 所以我尝试为ProductCell设置更大的值,但不是100%正确,它会在末尾添加额外的空间(UICollectionView: One Row or Column)。
    • 我尝试使用productsCollectionView方法中的自定义productsCollectionView类使minimumInteritemSpacing高度与ProductCell高度相同,但它不起作用,高度发生了变化但是在同一列的细胞,我不知道为什么!
  • 尝试问题(3):
    • 我不知道为什么插入新项目导致滚动,有时为第一项,有时在少数项目之前,有时它可以正常使用奇怪的大小调整动画!无论如何,我试图禁用我调整大小productsCollectionView代码,但没有任何反应。
    • 我尝试保存当前UICollectionViewFlowLayout然后应用它,只有当我将layoutAttributesForItem参数设置为等于productsCollectionView时,它才有效,否则将无法指定滚动。

注意: 抱歉我的英语不好&感谢。

0 个答案:

没有答案