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

标签 ios swift uicollectionview uikit uicollectionviewflowlayout

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

相关文章:

ios - 如何在 UIImagepickercontroller 中隐藏状态栏?

ios - iOS 上的 Node.JS 开发?

swift - Mixpanel初始化错误: argument passed to call that takes no arguments

swift - 以编程方式限制 UICollectionViewCell 的动态高度?

iphone - 获取国家调用前缀

ios - 自定义模式呈现忽略 preferredInterfaceOrientationForPresentation

swift - 当我将 @objc 推理更改为关闭时(在我转换为 Swift 4 的项目上),为什么我的 UIPickerView 项目不会显示?

ios - 使用 twitter swift 4 登录时出错

ios - 滚动到一个 collectionView 到一个物种索引

ios - 分页在 collectionview 中是如何工作的?