使用瀑布布局和自定义单元格

时间:2017-07-28 15:03:18

标签: swift3 uicollectionview ios9 ios10 uicollectionviewlayout

我正在尝试使用自适应单元格来实现waterfallLayout,该单元格应该适用于iOS> = 9.0 像pintrest collectionViewLayout这样的东西不是转换,但区别在于我有一个固定的图像比例,但下面的字段是动态的,我使用UIStackView

enter image description here   自我调整工作正常,但我的问题是将细胞起源改变为细胞之间的总是= 15 PX。

所以当我在没有任何自定义的情况下尝试FlowLayout时,一切正常,除了单元格之间的边距不正确但滚动效果不错,没有iOS的任何性能问题> = 9.0

尝试CustomizingFlowLayout后,iOS 10中的性能非常糟糕,iOS 9中的功能无法正常工作。我知道苹果在UICollectionView上做了一些改进,但对我来说,我没有看到这种改进。

我的手机:

 override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    self.setNeedsLayout()
    self.layoutIfNeeded()
    layoutAttributes.bounds.size.height = systemLayoutSizeFitting(layoutAttributes.size, withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityFittingSizeLevel).height
    return layoutAttributes
}

我的控制器:

ViewDidLoad {
  layoutView = collectionView.collectionViewLayout as! CustomLayout
        if #available(iOS 10.0, *) {
            self.collectionView.isPrefetchingEnabled = false
        }
        layoutView.estimatedItemSize = CGSize(width:      layoutView.cellWidth, height: 200)
 }

extension RecipesCollectionWithSortBar: UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return array.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell.reuseIdentifier, for: indexPath) as! customCell
    return cell
}
 extension RecipesCollectionWithSortBar : UICollectionViewDelegateFlowLayout {

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.bounds.maxY == scrollView.contentSize.height &&  !isLoadingMoreRecipes {
       //
        LoadMore
    }
  }

我的CustomFlowLayout

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attrs = super.layoutAttributesForElements(in: rect)
        var attrsCopy = [UICollectionViewLayoutAttributes]()

        for element in attrs! where (element.copy() as! UICollectionViewLayoutAttributes).representedElementCategory == .cell
            && element.frame.height != cacheCells[element.indexPath.item]?.frame.height {
            if element.indexPath.item == 0 {
                element.frame.origin.y = self.sectionInset.top
                element.frame.origin.x = self.sectionInset.left
            } else if element.indexPath.item == 1 {
                element.frame.origin.y = self.sectionInset.top
                element.frame.origin.x = cacheCells[0]!.frame.maxX + margin
            } else {
                let previous = cacheCells[element.indexPath.item - 2]
                element.frame.origin.y = previous!.frame.maxY + self.minimumInteritemSpacing
                element.frame.origin.x = previous!.frame.origin.x
            }
            cacheCells[element.indexPath.item] = element
            attrsCopy.append(element)
        }

        let values = cacheCells.values.filter({ $0.frame.intersects(rect) })
        return values.map({ $0 })
    }

这里我有很多问题:  1-我在collectionView的末尾有一个巨大的空白区域,因为我更改了单元格原点,这个问题只发生在iOS> 10。  我试图覆盖内容大小

func getContentHeight() -> CGFloat {
        if !cacheCells.values.isEmpty {
            let attribute = cacheCells.values.max { $0.0.frame.maxY < $0.1.frame.maxY }
            return attribute!.frame.maxY + sectionInset.bottom
        }
        return contHeight
    }
    override var collectionViewContentSize: CGSize {
        return CGSize(width: self.cellWidth * CGFloat(columnCount), height: getContentHeight())
    }
由于某些原因iOS 9不喜欢这个解决方案滚动停止..

2- iOS 10中的滚动性能非常糟糕,iOS 9.0中的滚动性能最差。

<3>当我加载更多信不信任它滚动3或4次并且当我打印日志时没有更多项目显示(我有100个项目但是集合视图只显示70个)有时候当硬滚动时,它会记住还有更多项目并显示它们。我不确定我做错了什么。

现在已经有2个星期的时间试图找出错误可能会让我有什么新鲜的眼睛,并且心灵可以指出我遇到的问题。

0 个答案:

没有答案