gpt4 book ai didi

ios - 具有固定列数和动态单元格高度的 UICollectionView

转载 作者:行者123 更新时间:2023-11-29 05:10:46 24 4
gpt4 key购买 nike

可以找到很多关于 UICollectionView 的好信息,但我无法回答这个问题:

如何在单元格具有动态高度的情况下创建具有固定列数的垂直滚动 UICollectionView。

我的计划是使用自动调整单元格大小,但由于我想要固定数量的列,这需要每个单元格具有根据 Collection View 宽度计算的宽度约束,这看起来很奇怪,并且在更改设备方向时可能会出现问题。具体来说,我希望该集合具有紧凑的单列和常规的两列。

我还尝试在 UICollectionViewDelegateFlowLayout 上实现 collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize 这样就可以轻松设置单元格的宽度,因此它适合我想要的列数,但似乎无法将其与自动调整单元格高度相结合。

最佳答案

使用以下枚举创建一个辅助类。

enum DeviceTraitStatus {
///IPAD and others: Width: Regular, Height: Regular
case wRhR
///Any IPHONE Portrait Width: Compact, Height: Regular
case wChR
///IPHONE Plus/Max Landscape Width: Regular, Height: Compact
case wRhC
///IPHONE landscape Width: Compact, Height: Compact
case wChC

static var current:DeviceTraitStatus{

switch (UIScreen.main.traitCollection.horizontalSizeClass, UIScreen.main.traitCollection.verticalSizeClass){

case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.regular):
return .wRhR
case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.regular):
return .wChR
case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.compact):
return .wRhC
case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.compact):
return .wChC
default:
return .wChR

}

}

}

然后在 Collection View 委托(delegate)方法中相应地计算宽度。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
return size(for: indexPath)
}

private func size(for indexPath: IndexPath) -> CGSize
{
let cell = Bundle.main.loadNibNamed("YourCollectionViewCell", owner: self, options: nil)?.first as! BoxSelectCollectionCell

cell.setNeedsLayout()
cell.layoutIfNeeded()

// Call the method to calculate the width
var width: CGFloat = 0
switch DeviceTraitStatus.current
{
case .wChR, .wChC: width = (collectionView.frame.size.width - padding/2).rounded(.down)

case .wRhR, .wRhC: width = (collectionView.frame.size.width/2 - padding/2).rounded(.down)

}
let height: CGFloat = 0

let targetSize = CGSize(width: width, height: height)

var size = cell.contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: .defaultHigh, verticalFittingPriority: .fittingSizeLevel)

return size
}

关于ios - 具有固定列数和动态单元格高度的 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59707303/

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