У меня есть представление коллекции, и я хочу, чтобы это был раздел n, где каждый раздел имеет десять ячеек, моя проблема: может быть, n равно тридцати пяти, в этом случае я хочу показать раздел 3 с десятью ячейками и последний раздел с всего пять.
Я не хочу, чтобы это было объявлено, просто нужно, чтобы в последнем разделе было пять или n% 10
Я не понял условия. Последний раздел = 5 ячеек, а остальные разделы = n%10 ячеек?
нет, если есть 35 элементов, мне нужны разделы (10,10,10,5), если 47 (10,10,10,10,7).
Обновлен код с необходимыми условиями.
большое спасибо мой друг, это решено.
Вы можете просто реализовать методы 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
будет иметь
last section
other sections
Пожалуйста, уточните ваши условия, чтобы я мог соответствующим образом обновить код.
Он создает 3 раздела, когда n = 35. Он дает [10,10,10], а не [10,10,10,5]
Если количество массивов равно 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!
}
}
спасибо, да, я понял, почему это работает, я отладил код и понял, что функция numberofiteminsection
вызывается по количеству секций и при каждом вызове возвращает число, которое присваивается количеству ячеек в текущем вызове.
Вы можете разбить массив на куски, используя это расширение
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]
Затем используйте двумерный массив в методах делегата представления коллекции.
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
}
}
Есть ли способ использовать var вместо числа «10»?
А как быть с остальными разделами, если n = 35?