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

Невозможно вызвать метод UICollectionReusableView

Я хочу, чтобы мои разделы в UICollectionView имели заголовок с изображением.

Я выполнил следующие шаги:

  • на раскадровке, назначен заголовок в качестве аксессуара для моего UICollectionView
  • дал ему идентификатор
  • создал подкласс UICollectionReusableView для него
  • назначил пользовательский класс классу на раскадровке.
  • введите ImageView в ассемблере заголовка
  • сделал выход для ImageView в пользовательском классе в файле .h
  • В viewDidLoad реализовано следующее:

 

[self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier];

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableview = nil;

    if (kind == UICollectionElementKindSectionHeader)
    {
        ScheduleHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier forIndexPath:indexPath];

        headerView.headerImageView.image = [UIImage imageNamed:@"blah.png"];

        reusableview = headerView;
    }

    return reusableview;
}

Я знаю, что методы datasource и delegate работают, потому что я могу видеть все ячейки и их разделы. Однако у меня нет заголовков. Я поставил точку останова по вышеописанному методу и никогда не вызывался.

Что я делаю неправильно?

4b9b3361

Ответ 1

Кажется, что вам нужно дать вашему заголовку ненулевой размер или collectionView:viewForSupplementaryElementOfKind:atIndexPath не вызывается. Поэтому либо установите для свойства headerReferenceSize компоновку потока так:

flowLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 100.f);

или, реализуйте collectionView:layout:referenceSizeForHeaderInSection, если вы хотите изменить размер по разделам.

Ответ 2

Вы ответили на вопрос, но на словах я понимаю лучше:

Чтобы вызвать вызываемый метод, добавьте следующие методы:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
    return CGSizeMake(60.0f, 30.0f);
}

... и идите оттуда.

Ответ 4

Вы добавили UICollectionViewDelegateFlowLayout в текущий интерфейс? Это сработало для меня.

@interface MyViewController() <UICollectionViewDelegateFlowLayout>

Swift:

class MyViewController: UICollectionViewDelegateFlowLayout {

Ответ 5

Swift 3.0 (xcode 8.2.1)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width:collectionView.frame.size.width, height:30.0)
    }

Ответ 6

Существует быстрая версия:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    let size = CGSize(width: 400, height: 50)
    return size
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    let size = CGSize(width: 400, height: 50)
    return size
}

XCode (версия 7.3.1) не предлагает эти методы в автозаполнении!

Если вы просто хотите заголовок, просто сохраните метод заголовка.

Ответ 7

Моя проблема заключалась в том, что в swift 3 имя функции viewForSupplementaryElementOfKind немного изменилось с любых сообщений, которые были при переполнении стека. Следовательно, его никогда не вызывали. Убедитесь, что если вы находитесь в режиме быстрого 3, вы выполняете функции делегата:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}

Ответ 8

У меня такая же проблема. Я добавил referenceSizeForFooterInSection но затем также не viewForSupplementaryElementOfKind. Я добавил этот код в viewDidLoad() и он работал для меня:

 if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.sectionFootersPinToVisibleBounds = true

    }

Ответ 9

Для меня, в Swift 4.2, func collectionView (collectionView: kind: indexPath :) → UICollectionReusableView никогда не вызывался. Это было для представления коллекции в UIViewController. Я заметил, что существующие функции представления коллекции были квалифицированы с помощью @objc, и что UICollectionView не принял протоколы UICollectionViewDataSource и UICollectionViewDelegate. Как только я принял протоколы, я получил ошибки о том, что функции представления коллекции не соответствуют протоколу. Я исправил синтаксис функции, удалил классификаторы, и заголовки разделов начали работать.