我有一个集合视图,其中有一个带有标题的部分,每个部分都有一些单词。单词的大小不同。
由于单词的大小不同,我添加了以下内容,以防止删除长单词: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()
答案 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)