我正在尝试使用自适应单元格来实现waterfallLayout,该单元格应该适用于iOS> = 9.0
像pintrest collectionViewLayout这样的东西不是转换,但区别在于我有一个固定的图像比例,但下面的字段是动态的,我使用UIStackView
。
自我调整工作正常,但我的问题是将细胞起源改变为细胞之间的总是= 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个星期的时间试图找出错误可能会让我有什么新鲜的眼睛,并且心灵可以指出我遇到的问题。