Как создать открытый / закрытый раздел collectionView
У меня есть UICollectionView
с количеством ячеек под заголовком, ничего особенного.
Это то, что я хочу, чтобы collectionView был открываемым и закрываемым. Когда представление загружено, раздел закрывается, и при нажатии на заголовок будут показаны все ячейки (с обычной анимацией открытия).
У кого-нибудь есть идея, как я могу это сделать?
Спасибо!
2 ответа
Есть несколько разных способов сделать это, но простой способ - отслеживать, какие разделы расширены.
var expandedSections = NSSet()
Затем настройте распознаватель жестов в заголовке раздела, чтобы сообщить, когда он был нажат. Когда пользователь нажимает на раздел, вам нужно два метода:
func sectionHeaderWasTapped(section: Int) {
if self.expandedSections.contains(section) {
self.expandedSections.removeObject(Int)
}
else {
self.expandedSections.addObject(Int)
}
self.collectionView.reloadSections(NSIndexSet(index: section))
}
тогда в numberOfItemsInSection сделайте:
func numberOfItemsInSection(section: Int) {
if self.expandedSections.contains(section) {
return numberOfItemsInSection
}
else {
return 0
}
}
Вы можете создать вспомогательные методы, чтобы немного убрать это. Например:
func toggleSectionExpanded(section: Int) {
if self.expandedSections.contains(section) {
self.expandedSections.removeObject(Int)
}
else {
self.expandedSections.addObject(Int)
}
self.collectionView.reloadSections(NSIndexSet(index: section))
}
а также
func sectionIsExpanded(section:Int) {
return self.expandedSections.contains(section)
}
если вы хотите немного навести порядок
Вы можете сделать это с помощью вставки и удаления клеток.
Используйте для этого insertItemsAtIndexPaths
а также deleteItemsAtIndexPaths
методы в performBatchUpdates
блок, как показано ниже:
[self.collectionView performBatchUpdates:^ {
[datasource insertObject:OBJECT atIndex:INDEX];
[self.collectionView insertItemsAtIndexPaths:@[INDEX_PATH]];
} completion:nil];
а также
[self.collectionView performBatchUpdates:^ {
[datasource removeItemAtIndex:INDEX_PATH];
[self.collectionView deleteItemsAtIndexPaths:@[INDEX_PATH]];
} completion:nil];