Как создать открытый / закрытый раздел 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];
Другие вопросы по тегам