Подтвердить что ты не робот

UICollectionView с заголовками разделов, такими как UITableView

У меня есть быстрый вопрос: кто-нибудь смог успешно создать и реализовать заголовки разделов в CollectionView, похожие на заголовки в TableView? Я провел много исследований и нашел фрагменты кода, но не был примером для тех, кто успешно достиг этого. У меня есть CollectionView фотографий, чего я пытаюсь добиться, это группировать их по разделам в зависимости от месяца, в который они были сделаны. Мне удалось разбить их на те разделы, но теперь у меня есть пустой заголовок прямо над началом каждого раздела. То, что я хочу сделать, это показать месяцы в тех пустых заголовках. Точно так же буквы в каждом разделе отображаются в Tableview, который отображает контакты. Спасибо за ваши ответы заранее.

4b9b3361

Ответ 1

  • Включить просмотр заголовка/нижнего колонтитула раздела в раскадровке.

  • Внедрить метод collectionView:viewForSupplementaryElementOfKind.

см. Эта ссылка

Ответ 2

Добавление заголовков разделов в виде коллекции работает для меня со следующей настройкой:

  • добавить файл xib для определения содержимого заголовка. Файл xib содержит только одно определение типа ячейки. В моем случае представление заголовка имеет собственный тип (ImageCollectionViewHeaderCell), который происходит от UICollectionViewCell. Я думаю, что это требуется, но я не уверен. Идентификатор ячейки также установлен на предопределенную строку (например, "ImageCollectionViewHeaderCellId"

  • добавить заголовок и файлы реализации для настраиваемого типа. Удобно иметь метод для получения своего объекта UINib (своего рода прокси для xib файла, созданного на шаге 1).

    @implementation ImageCollectionViewHeaderCell
    + (UINib*) nib
    {
      return [UINib nibWithNibName:@"nameOfXibFileCreatedAtStep1" bundle:nil];
    }
    
    @end
    
  • в контроллере представления коллекции (который, в моем случае, также является источником данных и делегатом UICollectionView), в методе viewDidLoad добавьте регистрацию для типа дополнительного элемента

    - (void) viewDidLoad
    {
       [_collectionView registerNib:[ImageCollectionViewHeaderCell nib] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"ImageCollectionViewHeaderCellId"];
    }
    
  • в контроллере представления коллекции, добавьте методы для возврата высоты нестандартного заголовка и экземпляров представления заголовка

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
    {
      return CGSizeMake(0., 30.);
    }
    
    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
    {
      NSAssert([kind isEqualToString:UICollectionElementKindSectionHeader], @"Unexpected supplementary element kind");
      UICollectionReusableView* cell = [collectionView dequeueReusableSupplementaryViewOfKind:kind
                                                                  withReuseIdentifier:ImageCollectionViewHeaderCellIdentifier
                                                                         forIndexPath:indexPath];
    
      NSAssert([cell isKindOfClass:[ImageCollectionViewHeaderCell class]], @"Unexpected class for header cell");
    
      ImageCollectionViewHeaderCell* header_view = (ImageCollectionViewHeaderCell*) cell;
    
      // custom content
    
      return cell;
    }