gpt4 book ai didi

ios - UICollectionView .reloadData() 仅显示部分

转载 作者:行者123 更新时间:2023-11-30 11:07:14 25 4
gpt4 key购买 nike

我有一个 Collection View ,其中有一个带有标题的部分,每个部分都有一些单词。单词大小不同。

由于单词大小不同,我添加了以下内容,以防止长单词被截断:layout.estimatedItemSize = CGSize(width: 1.0, height: 1.0)

但是,在设置并调用 reloadData() 后,单元格(单词)不会仅加载部分(标题)。

但是滚动后,所有超出屏幕的部分都会加载它们的文字。但是,当我不使用layout.estimatedItemSize时,它可以正常工作,但单词会被切断。

所以我的问题是是否有另一种方式来显示这些单词(基本上是带有标签的小 View )而不被切断。或者我错误地使用了estimatedSize?

正如我从苹果本身的文档中读到的:docs此属性的默认值为 CGSizeZero。将其设置为任何其他值都会导致 Collection View 使用单元格的 PreferredLayoutAttributesFitting(_:) 方法查询每个单元格的实际大小。

我确实动态和静态地设置约束(StoryBoard),我的动态约束如下:

if prevCell != nil {
let constraint = NSLayoutConstraint(item: cell, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: prevCell, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: 5.0)
cell.addConstraint(constraint)
self.prevCell = cell
}

到目前为止我自己尝试过的事情:

//before reload data invalidate the layout
self.collectionView!.collectionViewLayout.invalidateLayout()
self.collectionView!.reloadData()

最佳答案

经过更多研究,找到了处理此问题的正确方法。我忘记覆盖单元格类中的preferredLayoutAttributesFitting。为了使其工作,我只是将 layout.estimatedItemSize = CGSize(width: 1.0, height: 1.0) 留在 Collection View 的 viewDidLoad 中。

然而,不知怎的,这还不够,因为直到你将其滚动到屏幕之外时,它才能计算出正确的尺寸。它背后可能有一些我不知道的逻辑。

但是当重写preferredLayoutAttributesFitting时如下:

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
setNeedsLayout()
layoutIfNeeded()
let updatedSize = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var updatedFrame = layoutAttributes.frame
updatedFrame.size.width = CGFloat(ceilf(Float(updatedSize.width)))
updatedFrame.size.height = CGFloat(ceilf(Float(updatedSize.height)))
layoutAttributes.frame = updatedFrame
return layoutAttributes
}

关于ios - UICollectionView .reloadData() 仅显示部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com