Как разделить разделы в UICollectionView?

#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. Переместите все разделы после раздела, разделяемого на 1
  2. Вставьте раздел после разделяемого раздела
  3. Удалите все элементы после индекса разделения из текущего раздела
  4. Вставьте все элементы во вновь созданный раздел.

Для объединения разделов можно использовать обратную идею.

Вот решение:

 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()
      })
    }
  }