89

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

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

我究竟做错了什么?

4

12 回答 12

219

看来你必须给你的标题一个非零大小或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如果您想按部分改变大小,请实施。

于 2013-08-11T16:41:59.647 回答
36

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

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

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

...然后从那里去。

于 2014-06-18T22:19:03.423 回答
32

斯威夫特 4 Xcode 9.1 测试版 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-call-in-swift-3-c6065ed7b4cd

于 2017-10-12T21:44:41.467 回答
21

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

@interface MyViewController () <UICollectionViewDelegateFlowLayout>

迅速:

class MyViewController: UICollectionViewDelegateFlowLayout {

于 2015-01-17T04:13:52.353 回答
9

斯威夫特 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)
}
于 2017-01-17T18:54:27.613 回答
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)没有在自动完成中提出这些方法!

如果你只想要一个标题,只需保留标题方法。

于 2016-08-15T12:57:17.930 回答
3
    @objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { }

上面的代码对我有用

于 2020-04-20T11:19:54.670 回答
2

我的问题是,在 swift 3 中,viewForSupplementaryElementOfKind 函数的名称与堆栈溢出的任何帖子略有不同。因此,它从未被调用过。确保,如果你在 swift 3 中,你的委托函数匹配:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {}
于 2017-02-18T16:38:59.673 回答
1

我有同样的问题。我已经添加referenceSizeForFooterInSection但也viewForSupplementaryElementOfKind没有被调用。我已经添加了这段代码viewDidLoad(),它对我有用:

if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    flowLayout.sectionFootersPinToVisibleBounds = true   
}
于 2019-01-31T13:17:01.033 回答
1

Swift 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)
}
于 2021-02-13T15:24:36.450 回答
0

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

于 2019-05-07T12:38:25.443 回答
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 {
...
于 2020-10-31T22:06:49.183 回答