gpt4 book ai didi

swift - UICollectionView sizeForItemAt 已调用但大小不正确

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

我希望第一部分的单元格为 Collection View 的全宽度,第二部分的单元格为宽度的一半。启动时,单元格不遵循给定的宽度,尽管高度似乎受到尊重。几秒钟后, Collection View 将重新加载,并且大多数时候它将单元格设置为正确的大小。当手机方向变为横向时,单元格会再次以不正确的尺寸绘制。

我尝试使用 UICollectionViewDelegateFlowLayout 和 sizeForItemAt 委托(delegate)函数来设置单元格大小,但即使调用该函数,它们也不遵循给定的大小。

目前,我正在设置部分插入,然后计算 Collection View 边界中单元格的剩余可用宽度,然后将宽度除以每行单元格数。

class HomeCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

let sectionInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

override func viewDidLoad() {
super.viewDidLoad()

self.collectionView?.contentInsetAdjustmentBehavior = .always
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: collectionView.frame.width, height: 44)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return self.sectionInsets
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return self.sectionInsets.left
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
var numberOfItemsPerRow: CGFloat = 1
var height: CGFloat = 0

switch indexPath.section {
case 0:
numberOfItemsPerRow = 1
height = 97
case 1:
numberOfItemsPerRow = 2
height = 126
default:
break
}

let padding = self.sectionInsets.left * (numberOfItemsPerRow + 1)
let availableWidth = collectionView.bounds.size.width - padding
let width = availableWidth / numberOfItemsPerRow

return CGSize(width: width, height: height)
}
}

这会导致单元格大小不正确,如下图所示。 Incorrect Example Image

它们大小正确的唯一时间是在重新加载 Collection View 之后。 Correct Example Image

此外,当手机转向横向时,它显示不正确。 Incorrect Landscape Example Image

总结我的问题,第一部分的单元格应始终采用 100% 的可用宽度。如果可能的话,如果它们有自动高度就好了。我尝试过使用 UICollectionViewFlowLayout.automaticSize.height 但我认为这不起作用。对于第二部分,它需要始终占用可用宽度的 50%。

最佳答案

如果您使用 Storyboard 来创建 CollectionView。

我想我必须invalidateLayout()。事实证明,iOS 13 存在一个奇怪的错误。

您必须创建自己的 UICollectionViewFlowLayout。在您的 viewDidLoad()

中调用类似的内容

collectionView.collectionViewLayout = {
let flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = .horizontal
return flowLayout
}()

关于swift - UICollectionView sizeForItemAt 已调用但大小不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290911/

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