Невозможно вызвать метод 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 работают, потому что я могу видеть все ячейки и их разделы. Однако у меня нет заголовков. Я поставил точку останова по вышеописанному методу и никогда не вызывался.
Что я делаю неправильно?
Ответы
Ответ 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);
}
... и идите оттуда.
Ответ 3
Swift 4 Xcode 9.1 Beta 2
Добавить @objc
@objc func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize{
let size = CGSize(width: 400, height: 50)
return size
}
Кредиты:
https://medium.com/@zonble/your-delegation-methods-might-not-be-called-in-swift-3-c6065ed7b4cd
Ответ 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. Как только я принял протоколы, я получил ошибки о том, что функции представления коллекции не соответствуют протоколу. Я исправил синтаксис функции, удалил классификаторы, и заголовки разделов начали работать.