UICollectionView с фиксированным количеством столбцов и динамической c высоты ячейки - PullRequest
0 голосов
/ 12 января 2020

Можно найти много полезной информации о UICollectionView, но я не смог ответить на этот вопрос:

Как бы вы go рассказали о создании UICollectionView с вертикальной прокруткой с фиксированным числом столбцов, пока ячейка Имеет динамический c высота.

Мой план состоял в том, чтобы использовать ячейки с саморазмером, но так как я хочу фиксированное количество столбцов, для которых каждая ячейка должна иметь ограничение ширины, которое рассчитывается из ширины коллекции, это кажется причудливый и может вызвать проблемы при изменении ориентации устройства. Для уточнения c Я хочу, чтобы коллекция располагалась на одном столбце в компактном и два в обычном.

Я также пытался реализовать collectionView(UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize на UICollectionViewDelegateFlowLayout таким образом, легко установить ширину ячеек, чтобы она соответствовала количеству нужных столбцов, но кажется, что объединить невозможно это с ростом размера ячейки.

1 Ответ

0 голосов
/ 12 января 2020

Создайте вспомогательный класс со следующим перечислением.

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

        }

    }

}

Затем в методе делегата представления коллекции рассчитайте ширину соответственно.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...