gpt4 book ai didi

ios - 在 iOS 12 中,UICollectionView 布局单元格何时在 nib 中使用自动布局

转载 作者:IT王子 更新时间:2023-10-29 07:40:23 25 4
gpt4 key购买 nike

类似这样的代码

collectionLayout.estimatedItemSize = CGSize(width: 50, height: 25)
collectionLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize
collectionLayout.minimumInteritemSpacing = 10

for _ in 0 ..< 1000 {
let length = Int(arc4random() % 8)
let string = randomKeyByBitLength(length)
array.append(string!)
}
collectionView.reloadData()

单元格约束:

enter image description here

当我在 iOS 12 上运行时,情况有所不同。左边的模拟器是 iOS 11,右边的是 iOS 12:

enter image description here

但是,当我滚动它时,单元格的框架将是正常的。


重现问题的示例项目:https://github.com/Coeur/StackOverflow51375566

最佳答案

对于所有解决方案,请注意无需在 viewDidLoad 中显式调用 reloadData:它会自动发生。

方案一

灵感来自 Samantha idea : invalidateLayoutviewDidLoad 中异步。

override func viewDidLoad() {
super.viewDidLoad()

//[...]

for _ in 0 ..< 1000 {
array.append(randomKeyByBitLength(Int(arc4random_uniform(8)))!)
}

DispatchQueue.main.async {
self.collectionView.collectionViewLayout.invalidateLayout()
}
}

解决方案2

(不完美,看DHennessy13改进)

基于 Peter Lapisu answer . viewWillLayoutSubviews 中的 invalidateLayout

override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
collectionView.collectionViewLayout.invalidateLayout()
}

正如 DHennessy13 所指出的,当前使用 viewWillLayoutSubviews 的解决方案并不完美,因为它会在旋转屏幕时使布局无效。

您可以关注DHennessy13 improvement关于这个解决方案。

方案三

基于 Tyler Sheaffer answer 的组合, Shawn Aukstak port to Swift和萨曼莎的想法。子类化您的 CollectionView 以在 layoutSubviews 上执行 invalidateLayout

class AutoLayoutCollectionView: UICollectionView {

private var shouldInvalidateLayout = false

override func layoutSubviews() {
super.layoutSubviews()
if shouldInvalidateLayout {
collectionViewLayout.invalidateLayout()
shouldInvalidateLayout = false
}
}

override func reloadData() {
shouldInvalidateLayout = true
super.reloadData()
}
}

这个解决方案很优雅,因为它不需要更改您的 ViewController 代码。我已经在这个示例项目的分支 AutoLayoutCollectionView 上实现了它 https://github.com/Coeur/StackOverflow51375566/tree/AutoLayoutCollectionView .

解决方案4

重写 UICollectionViewCell 默认约束。参见 Larry answer .

解决方案5

实现 collectionView(_:layout:sizeForItemAt:) 并返回 cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)。参见 matt answer .

关于ios - 在 iOS 12 中,UICollectionView 布局单元格何时在 nib 中使用自动布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375566/

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