Разделы CollectionView - PullRequest
       11

Разделы CollectionView

3 голосов
/ 28 мая 2019

У меня есть представление коллекции, и я хочу, чтобы оно состояло из n разделов, где каждый раздел имеет десять ячеек, моя проблема: Может быть, n равно тридцати пяти, в этом случае я хочу показать 3 раздела с десятью ячейками иПоследний раздел только с пятью.

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

Если число массивов равно 35 return count/10, если count%10 равно 0, иначе верните count/10+1 в numberOfSections методе

В numberOfItemsInSection методе умножьте текущий раздел на 10 и вычтите из числа.вернуть минимальное значение 10 или вычтенное значение

В методе cellForItemAt умножить сечение на 10 и добавить строку, чтобы получить индекс массива

class ViewController: UIViewController, UICollectionViewDataSource {
    var arr = Array(1...35)
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return (arr.count/10) + (arr.count%10 == 0 ? 0 : 1)
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return min(10,arr.count - (10*section))
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? Cell
        let currentStr = arr[(indexPath.section*10)+indexPath.item]
        cell?.label.text = "\(currentStr)"
        return cell!
    }
}

enter image description here

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

Вы можете разбить массив на куски, используя это расширение

extension Array {
    func chunked(into size: Int) -> [[Element]] {
        return stride(from: 0, to: count, by: size).map {
            Array(self[$0 ..< Swift.min($0 + size, count)])
        }
    }
}

Если число равно 35 -> [10,10,10,5]

Если число равно 30 -> [10,10,10]

Если число равно 29 -> [10,10,9]

Затем использовать двумерный массив в методах делегата viewview

class ViewController: UIViewController, UICollectionViewDataSource {
    let array = Array(1...35)
    lazy var chunkedArray = array.chunked(into: 10)

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return chunkedArray.count
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return chunkedArray[section].count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        print(chunkedArray[indexPath.section][indexPath.item])
        return cell
    }
}

enter image description here

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

Вы можете просто реализовать UICollectionViewDataSource методы и настроить collectionView(_:numberOfItemsInSection:) метод на основе каждого section для числа cells.

let n = 35 //It specify the total elements count

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return n/10
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch section {
    case (n/10):
        return (n % 10)

    default:
        return 10
    }
}

. В приведенном выше коде collectionView будет

  • (n% 10) ячеек для last section
  • 10 ячеек для other sections

Пожалуйста, уточните ваши условия, чтобы я мог обновитькод соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...