Невозможно отобразить длинную длинную коллекцию вида слева и маленькие ячейки справа - PullRequest
0 голосов
/ 08 мая 2019

У меня есть UICollectionView, который показывает 2 ячейки сверху и 3 снизу, как указано в

Эта ссылка

override func viewDidLoad() {
    super.viewDidLoad()
           let layout = UICollectionViewFlowLayout()
    layout.minimumLineSpacing = 5
    layout.minimumInteritemSpacing = 5

    collectionview2.delegate = self
    collectionview2.dataSource = self
    collectionview2.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "ident")

    }
  }


  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
      return 5
    }


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
 switch indexPath.item {
      case 0,1:
        return CGSize(width: (UIScreen.main.bounds.width - 16) / 2, height: (UIScreen.main.bounds.width - 16) / 2)
      default:
        return CGSize(width: (UIScreen.main.bounds.width - 32) / 3, height:  (UIScreen.main.bounds.width) / 3)
      }
}



func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ident", for: indexPath)
      cell.backgroundColor = .red
      return cell

}

Но я хочу показать одну длинную ячейку слева и две маленькие ячейки справа, вот так ..

enter image description here

Итак, какие изменения мне нужно внести в мой ответ ..?

РЕДАКТИРОВАТЬ 1 Это последний вывод ...

код в sizeForItemAt ..

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
 switch indexPath.item {
      case 0,3:
        return CGSize(width: (UIScreen.main.bounds.width - 16) / 2, height: (UIScreen.main.bounds.width - 16) / 2)
      case 1,2,4:
         return CGSize(width: (UIScreen.main.bounds.width - 32) / 3, height:  (UIScreen.main.bounds.width) / 3)
      default:
        return CGSize(width: (UIScreen.main.bounds.width - 32) / 3, height:  (UIScreen.main.bounds.width) / 3)
      }

}

Выход:

enter image description here

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Проверить это может вам помочь:)

DynamicHeightForCollectionView

Result Image

0 голосов
/ 08 мая 2019

Вам нужно создать подкласс UICollectionViewLayout, как показано ниже

class PinterestLayout: UICollectionViewLayout {
//1. Pinterest Layout Delegate
weak var delegate: PinterestLayoutDelegate!

//2. Configurable properties
fileprivate var numberOfColumns = 2
fileprivate var cellPadding: CGFloat = 6

//3. Array to keep a cache of attributes.
fileprivate var cache = [UICollectionViewLayoutAttributes]()

//4. Content height and size
fileprivate var contentHeight: CGFloat = 0

fileprivate var contentWidth: CGFloat {
  guard let collectionView = collectionView else {
    return 0
  }
  let insets = collectionView.contentInset
  return collectionView.bounds.width - (insets.left + insets.right)
}

override var collectionViewContentSize: CGSize {
  return CGSize(width: contentWidth, height: contentHeight)
}

override func prepare() {
  // 1. Only calculate once
  guard cache.isEmpty == true, let collectionView = collectionView else {
    return
  }
  // 2. Pre-Calculates the X Offset for every column and adds an array to increment the currently max Y Offset for each column
  let columnWidth = contentWidth / CGFloat(numberOfColumns)
  var xOffset = [CGFloat]()
  for column in 0 ..< numberOfColumns {
    xOffset.append(CGFloat(column) * columnWidth)
  }
  var column = 0
  var yOffset = [CGFloat](repeating: 0, count: numberOfColumns)

  // 3. Iterates through the list of items in the first section
  for item in 0 ..< collectionView.numberOfItems(inSection: 0) {

    let indexPath = IndexPath(item: item, section: 0)

    // 4. Asks the delegate for the height of the picture and the annotation and calculates the cell frame.
    let photoHeight = delegate.collectionView(collectionView, heightForPhotoAtIndexPath: indexPath)
    let height = cellPadding * 2 + photoHeight
    let frame = CGRect(x: xOffset[column], y: yOffset[column], width: columnWidth, height: height)
    let insetFrame = frame.insetBy(dx: cellPadding, dy: cellPadding)

    // 5. Creates an UICollectionViewLayoutItem with the frame and add it to the cache
    let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
    attributes.frame = insetFrame
    cache.append(attributes)

    // 6. Updates the collection view content height
    contentHeight = max(contentHeight, frame.maxY)
    yOffset[column] = yOffset[column] + height

    column = column < (numberOfColumns - 1) ? (column + 1) : 0
  }
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

  var visibleLayoutAttributes = [UICollectionViewLayoutAttributes]()

  // Loop through the cache and look for items in the rect
  for attributes in cache {
    if attributes.frame.intersects(rect) {
      visibleLayoutAttributes.append(attributes)
    }
  }
  return visibleLayoutAttributes
}

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
  return cache[indexPath.item]
}

}

См. Учебник

0 голосов
/ 08 мая 2019

Попробуйте это

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
 switch indexPath.item {
      case 0,3:
        return CGSize(width: (UIScreen.main.bounds.width - 16) / 2, height: (UIScreen.main.bounds.width) / 2)
      case 1,2,4:
         return CGSize(width: (UIScreen.main.bounds.width - 16) / 2, height:  (UIScreen.main.bounds.width) / 4)
      default:
        return CGSize(width: (UIScreen.main.bounds.width - 16) / 2, height:  (UIScreen.main.bounds.width) / 2)
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...