UICollectionView的实际性能真的很差

时间:2019-01-09 18:40:05

标签: swift performance uicollectionview uicollectionviewcell uicollectionviewflowlayout

我目前正在研究一个项目,基本上,我还在学习。

我在一开始就使用BidNumber HQregion Services PrimaryExec Value ,但是我需要自动调整高度和2或3列(取决于设备)。 对于列,我正在使用UITableView。 通常,我只使用UICollectionViewFlowLayoutLabels;像StackViews之类的一些警告(但我更改了一些优先级并且可以正常工作,但是性能仍然很差。

我没有从后端获取信息,没什么吸引人的。

Unable to simultaneously satisfy constraints如下:

CustomLayout

我确实需要2或3列具有自动高度的列。但是,与其他任何项目一样,真正重要的是:public protocol CollectionViewFlowLayoutDelegate: class { func numberOfColumns() -> Int func height(at indexPath: IndexPath) -> CGFloat } public class CustomLayout: UICollectionViewFlowLayout { private let cellPadding: CGFloat = 4 public var cache: [IndexPath : UICollectionViewLayoutAttributes] = [:] private var contentHeight: CGFloat = 0 private var contentWidth: CGFloat { guard let collectionView = collectionView else { return 0 } let insets = collectionView.contentInset return collectionView.bounds.width - (insets.left + insets.right) } public weak var flowDelegate: CollectionViewFlowLayoutDelegate? public override var collectionViewContentSize: CGSize { return CGSize(width: self.contentWidth, height: self.contentHeight) } public override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { var layoutAttributesArray = [UICollectionViewLayoutAttributes]() if cache.isEmpty { self.prepare() } for (_, layoutAttributes) in self.cache { if rect.intersects(layoutAttributes.frame) { layoutAttributesArray.append(layoutAttributes) } } return layoutAttributesArray } public override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { return self.cache[indexPath] } public override func prepare() { super.prepare() cache.removeAll() guard let collectionView = self.collectionView else { return } let numberOfColumns = self.flowDelegate?.numberOfColumns() ?? 1 self.contentHeight = 0 let columnWidth = UIScreen.main.bounds.width / CGFloat(numberOfColumns) - CGFloat(numberOfColumns-1) * cellPadding var xOffset = [CGFloat]() for column in 0 ..< numberOfColumns { xOffset.append(CGFloat(column) * columnWidth) } var column = 0 var yOffset = [CGFloat](repeating: 0, count: numberOfColumns) for item in 0 ..< collectionView.numberOfItems(inSection: 0) { let indexPath = IndexPath(item: item, section: 0) let photoHeight = self.flowDelegate?.height(at: indexPath) ?? 1 let height = cellPadding * 2 + photoHeight let frame = CGRect(x: xOffset[column], y: yOffset[column], width: columnWidth, height: height) let insetFrame = frame.insetBy(dx: cellPadding, dy: cellPadding) let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath) attributes.frame = insetFrame self.cache[indexPath] = attributes self.contentHeight = max(self.contentHeight, frame.maxY) yOffset[column] = yOffset[column] + height column = column < (numberOfColumns - 1) ? (column + 1) : 0 } } public override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { return true } }

非常感谢您。

1 个答案:

答案 0 :(得分:1)

事实证明,在我的ViewControllersfunc height(at indexPath: IndexPath) -> CGFloat protocol上,我每次都在计算高度,而不是仅从数组中检索高度。