UICollectionView .reloadData()仅显示部分

时间:2018-09-29 23:26:28

标签: ios swift uicollectionview self sizing

我有一个集合视图,其中有一个带有标题的部分,每个部分都有一些单词。单词的大小不同。

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

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

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

所以我的问题是,是否有另一种方式显示这些单词(基本上是带有标签的小视图)而不会被切断。还是我错误地使用了EstimatedSize?

正如我从Apple本身的文档中读到的:docs 此属性的默认值为CGSizeZero。将其设置为其他任何值都会导致集合视图使用单元格的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()

1 个答案:

答案 0 :(得分:0)

经过更多研究后,找到了解决此问题的正确方法。 我忘了覆盖单元格类中的preferredLayoutAttributesFitting。为了使其正常工作,我只将const VueSelector = require(require('path').resolve('./src/tests/VueSelector')) fixture('Auth.vue').page('http://127.0.0.1:8080/auth') test('correct render Auth', async t => { const auth = VueSelector('Auth') const authInstance = await auth.getVue() const { state, props, computed } = authInstance console.log(state, props, computed) })留在了集合视图的viewDidLoad中。

无论如何,这还不够,因为除非将其滚动到屏幕外,否则它无法计算出正确的尺寸。它背后可能有一些我不知道的逻辑。

但是当按如下方式覆盖preferredLayoutAttributesFitting时:

layout.estimatedItemSize = CGSize(width: 1.0, height: 1.0)