不会调用UICollectionReusableView方法


79

我希望我的部分中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;
}

我知道数据源和委托方法正在工作,因为我可以看到所有单元格及其部分。但是,我没有标题。我在上面的方法中设置了一个断点,但从未调用过它。

我究竟做错了什么?


3
请注意,您比较字符串指针kind == UICollectionElementKindSectionHeader而不是字符串内容,您可能想使用它[kind isEqualToString: UICollectionElementKindSectionHeader]
Mac_Cain14年

Answers:


198

看来您必须给标头提供一个非零的大小,否则collectionView:viewForSupplementaryElementOfKind:atIndexPath就不会调用它。因此,可以这样设置headerReferenceSize流布局的属性:

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

迅捷5+

flowLayout.headerReferenceSize = CGSize(CGSize(width: self.collectionView.frame.size.width, height: 100))

或者,collectionView:layout:referenceSizeForHeaderInSection如果您想按部分更改大小,请实施。


1
在集合视图中,我可以通过自动布局而不是定义headerReference大小来实现动态高度吗?
Khant Thu Linn

是否可以在flowLayout的Storyboard中设置headerReferenceSize?
Radek Wilczak

1
是的,它起作用了!layout.headerReferenceSize = CGSize(width:(self.collectionView?.frame.width)!, height:50); 对于swift4
Antony Ouseph'Mar

headerReferenceSize可以,但是我需要在不同的部分使用不同的尺寸。您指定的方法根本没有调用
Vyachaslav Gerchicov

33

您回答了这个问题,但是用语言我能更好地理解:

要调用该方法,请添加以下方法:

- (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);
}

...然后从那里去。


31

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-be-被称为-in-swift-3- c6065ed7b4cd


谢谢!救了我的屁股。顺便说一句,我注意到此功能未显示在collectionViewDelegate的自动完成列表中。我不知道为什么,所以很奇怪。同样奇怪的是我们需要在它前面的@objc标签。
C0D3

3
在Swift 4中仅将@objc添加到函数中对我有用。荒谬。
路易·克雷曼

7
如果您使用的是UICollectionViewFlowLayout,则遵循UICollectionViewDelegateFlowLayout而不是UICollectionViewDelegate也可以解决此问题,而无需@objc。
nemissm '18

如果您使用collectionView边界来设置部分页眉/页脚的with,那就更好了:let size = CGSize(collectionView.bounds.width,height:50)
omaestra

18

您是否在当前界面中添加了UICollectionViewDelegateFlowLayout?这对我有用。

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

迅速:

class MyViewController: UICollectionViewDelegateFlowLayout {


1
啊!就是这样了UICollectionViewDelegateFlowLayout
Ayan Sengupta

8

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)
}

5

有快速版本:

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)未在自动完成中提出这些方法!

如果只需要标题,则保留header方法。


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

上面的代码对我有用


2

我的问题是,在swift 3中,viewForSupplementaryElementOfKind函数的名称与堆栈溢出时的所有帖子都略有不同。因此,它从未被调用过。确保如果您使用的是Swift 3,则代表的是函数匹配:

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

我也是。对我而言,缺少“ _”,“ atIndexPath”而不是“ at”和“ NSIndexPath”而不是“ IndexPath”;因为我已经从某个地方复制了该方法,IDE并没有给我一个错误。
Ashkan Sarlak '18年

1

我有同样的问题。我已经添加了,referenceSizeForFooterInSection但后来也viewForSupplementaryElementOfKind没有接到电话。我已添加此代码viewDidLoad(),它对我有用:

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

0

对我来说,在Swift 4.2中,func collectionView(collectionView:kind:indexPath :)-> UICollectionReusableView从未被调用过。这是针对UIViewController中的集合视图的。我注意到现有的集合视图函数已使用@objc进行了限定,并且UICollectionView没有采用UICollectionViewDataSource和UICollectionViewDelegate协议。一旦采用了协议,我就会收到错误,即收集视图功能与协议不匹配。我更正了函数语法,删除了限定符,并且节标题开始起作用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.