可以找到很多关于 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/