#ios #swift #uicollectionview
#iOS #swift #uicollectionview
Вопрос:
У меня есть UICollectionView, который реализует страницы, организованные в разделы. Я хочу разделить раздел на две части и использовать следующую логику. Но UICollectionView, похоже, не доволен этим:
func splitSection(at index: IndexPath) {
// this performs the logical split
self.document.splitSection(at: index)
if let cv = self.collectionView {
cv.performBatchUpdates({
let N = self.document.numberOfSection
let n = N - index.section - 1
let range = Range.init(uncheckedBounds: (index.section, n))
let affectedSections = IndexSet.init(integersIn: range)
cv.reloadSections(affectedSections)
let sections = IndexSet.init(integersIn: Range.init(uncheckedBounds: (N-1, 1)))
cv.insertSections(sections)
}, completion: { (_) in
// commit section updates
})
}
}
Ответ №1:
в функции NumberOfSections возвращает 2, затем в функции cellforitemat используйте переключатель на indexpath.section
Комментарии:
1. У меня уже есть N разделов, как вы можете видеть в коде. self.document.splitSection уже разделяет и увеличивает количество разделов. И он уже реализует функцию cellForItemAt для реализации разделов. Я задаю логику инкрементного обновления для представления коллекции.
2. о какой логике инкрементного обновления вы говорите?
Ответ №2:
ОК. Итак, я думаю, что решил проблему после различных экспериментов. Вот окончательное решение на случай, если кто-то еще столкнется с этой проблемой.
Основная идея заключается в:
- Переместите все разделы после раздела, разделяемого на 1
- Вставьте раздел после разделяемого раздела
- Удалите все элементы после индекса разделения из текущего раздела
- Вставьте все элементы во вновь созданный раздел.
Для объединения разделов можно использовать обратную идею.
Вот решение:
func splitSection(at index: IndexPath) {
# first get a list of deleted and inserted indices as a result of splitting
let (deleted, inserted) = self.document.splitSection(at: index)
if let cv = self.collectionView {
cv.performBatchUpdates({
let N = self.document.numberOfSection
// now move over the sections to make space for one more section.
for idx in index.section 1..<N-1 {
cv.moveSection(idx, toSection: idx 1)
}
// add a new section
cv.insertSections(IndexSet.init(integer: index.section 1))
// now perform item movements to finish splitting
cv.deleteItems(at: deleted)
cv.insertItems(at: inserted)
}, completion: { (_) in
self.document.updateSections()
})
}
}