gpt4 book ai didi

ios - 在没有 `invalidateLayout` 跳转的情况下自动调整 UICollectionViewLayout(支持 iOS 9)中的单元格

转载 作者:行者123 更新时间:2023-12-01 19:52:15 28 4
gpt4 key购买 nike

我一直在阅读this article about using custom UICollectionViewLayouts并试图将这个想法融入我正在从事的项目中。

我们之前使用的是 UICollectionViewFlowLayout具有巨大丑陋函数的子类,通过将原型(prototype)单元出列并填充它然后询问它的大小来确定单元的大小。

不用说,我想找到一种更好的方法来做到这一点。

我遇到的问题是单元格的初始布局。我们使用的许多单元格包含 1 或 2 个标签,这些标签可能包含大量文本并且需要换行。在链接的文章中有一个游乐场,它显示自动调整大小的多行标签,但它在文本中插入换行符以强制执行此操作...

在 Datasource.swift 文件中...

lazy private var values: [String] = {
return (0...255).map {
_ in
switch arc4random_uniform(3) {
case 0: return "Hello"
case 1: return "Hello\nGoodbye"
default: return "Hello\nGoodbye\nAu revoir"
}
}
}()

但是,如果我将这些更改为会自然中断的不同长度的字符串,则会破坏该示例。初始布局在标签中只有一行。但是,在滚动标签时正确显示。

我可以通过添加 layout.invalidateLayout() 行来“解决”这个问题在 Autosizing文件。

现在,我在自己的项目中并尝试做同样的事情。使用 layout.invalidateLayout()如果我把它放在 viewDidAppear 中,只能在 View Controller 中使用功能。这意味着在布局不正确的过渡之后我们会出现尴尬的跳转,然后“跳转”到正确的布局。但是,我觉得使用 invalidateLayout 的整个方法被打破。

有没有办法让我不破坏初始布局?或至 intelligently使单元格初始布局无效?

我添加了 GitHub project这表明我遇到的问题。由于代码,目前它的布局正确......
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

// This invalidation "fixes" the layout but causes a jump in the UI
collectionView?.collectionViewLayout.invalidateLayout()
}

理想情况下,我想删除它并让布局“正常工作”。

最佳答案

这里的问题是,在初始阶段,单元格返回的首选布局属性不正确 - 它根据看似无限的宽度调整标签的大小,因此您最终希望它适合一行。

将此行添加到单元格 setUp()方法“修复”问题:

label.preferredMaxLayoutWidth = self.bounds.width - (contentView.layoutMargins.left + contentView.layoutMargins.right)

这有点脏,我相信有更好的方法。

编辑

好的,这里有一个更好的方法。这会强制您的 View 进入布局中的原始估计框架,让 AL 引擎有机会正确调整单元格的大小。在您的单元格子类中执行此操作:
private var isInitialLayout = true

public override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
if isInitialLayout {
self.contentView.layoutIfNeeded()
isInitialLayout = false
}
return super.preferredLayoutAttributesFitting(layoutAttributes)
}

关于ios - 在没有 `invalidateLayout` 跳转的情况下自动调整 UICollectionViewLayout(支持 iOS 9)中的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031700/

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