未调用UICollectionReusableView方法

时间:2013-08-11 14:54:01

标签: ios uicollectionview

我希望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;
}

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

我做错了什么?

12 个答案:

答案 0 :(得分:166)

似乎您必须为标头指定非零大小,否则不会调用collectionView:viewForSupplementaryElementOfKind:atIndexPath。因此,要么像这样设置流布局的headerReferenceSize属性:

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

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

答案 1 :(得分:29)

你回答了这个问题,但我用更好的理解:

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

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

......从那里开始。

答案 2 :(得分:19)

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

答案 3 :(得分:10)

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

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

夫特:

class MyViewController:UICollectionViewDelegateFlowLayout {

答案 4 :(得分:7)

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 :(得分: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)不建议在自动完成中使用这些方法!

如果您只想要一个标题,请保留标题方法。

答案 6 :(得分:3)

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

上面的代码对我有用

答案 7 :(得分:2)

我的问题是在swift 3中,viewForSupplementaryElementOfKind函数的名称与堆栈溢出的任何帖子略有不同。因此,它永远不会被召唤。如果你在swift 3中,请确保你是委托功能匹配:

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

答案 8 :(得分:1)

我有同样的问题。我添加了 referenceSizeForFooterInSection ,但后来又没有 viewForSupplementaryElementOfKind 被打来。 我已将此代码添加到viewDidLoad()中,并且对我有用:

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

    }

答案 9 :(得分:1)

斯威夫特 5 轻松简单的方式

您的代码中仅缺少这两行,您就可以完成

在任何地方使用这些行

let layout = self.colv.collectionViewLayout as! UICollectionViewFlowLayout
layout.headerReferenceSize = CGSize(width: self.colv.frame.size.width, height: 100)

我在

中使用这些行
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let CellCount = CGFloat(3.0)
    let width = CGFloat(collectionView.frame.size.width/CellCount)
    //let height = CGFloat(collectionView.frame.size.height)

    
    let layout = self.colv.collectionViewLayout as! UICollectionViewFlowLayout

    layout.headerReferenceSize = CGSize(width: self.colv.frame.size.width, height: 100)
    
    return CGSize(width: width, height: width+10)
}

答案 10 :(得分:0)

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

答案 11 :(得分:0)

如果您有通用子类,则必须注意指定ObjC委托方法名称 如果它不同于Swift名称(https://bugs.swift.org/browse/SR-2817)。

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