天道酬勤,学无止境

Display Section Header UICollectionReusableView

问题

我正在开发 iOS 应用程序,但在使用 UICollectionView 单元格时遇到了几个问题。

这次想问一下UICollectionView(UICollectionReusableView)的section header如何显示

我已经实现了如下功能:

public func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

        switch kind {

        case UICollectionElementKindSectionHeader:

            let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "cellHeader", for: indexPath as IndexPath)
            var labelHeader = headerView.viewWithTag(2) as! UILabel

            if indexPath.section == 0 {
                labelHeader.text = "Specialist Clinic"

            }
            else {
                labelHeader.text = "Medical Support"
            }

            headerView.backgroundColor = UIColor.blue;
            return headerView

        default:
            assert(false, "Unexpected element kind")
        }
    }

但是,它总是给出一个空白的结果。 请看下面的屏幕截图

回答1

您需要返回标头的大小。

func collectionView(_ collectionView: UICollectionView,
                     layout collectionViewLayout: UICollectionViewLayout,
                     referenceSizeForHeaderInSection section: Int) -> CGSize {
    return CGSize(width: collectionView.frame.size.width, height: 123) // you can change sizing here 
}

委托方法

  func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
            var reusableview: UICollectionReusableView? = nil
            if kind == UICollectionElementKindSectionHeader {
                reusableview = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "cellHeader", for: indexPath) // cellHeader is your identifier
            var labelHeader = reusableview.viewWithTag(2) as! UILabel

         if indexPath.section == 0 {
                labelHeader.text = "Specialist Clinic"

            }
            else {
                labelHeader.text = "Medical Support"
            }

            headerView.backgroundColor = UIColor.blue;
               
            }
            return reusableview!
        }
回答2

我为您创建了演示。 下载并重新使用到您的代码中。 干杯!

下载链接:https://www.dropbox.com/sh/vzf2tpe0ccf41tv/AABjdPAoaP2sE7YRtUgersq4a?dl=0

回答3
      public func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    switch kind {

    case UICollectionElementKindSectionHeader:

        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "cellHeader", for: indexPath as IndexPath)
        var labelHeader = headerView.viewWithTag(2) as! UILabel

        if indexPath.section == 0 {
            labelHeader.text = "Specialist Clinic"

        }
        else {
            labelHeader.text = "Medical Support"
        }

        headerView.backgroundColor = UIColor.blue;
        headerView.addSubview(labelHeader) //Add UILabel on HeaderView
        return headerView

    default:
        assert(false, "Unexpected element kind")
    }
}
回答4

这是我的解决方案。 它的完成类似于为 indexPathAt 将单元格/行出列。

集合视图

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

// content of header
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    guard let headerCell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: CollectionViewHeader.identifier, for: indexPath) as? CollectionViewHeader else {
        return UICollectionReusableView()
    }
    headerCell.titleLabel.text = "Title"
    return headerCell
}

UICollectionReusableView 子类

class CollectionViewHeader: UICollectionReusableView {
    let identifier = "headerView"
    @IBOutlet weak var titleLabel: UILabel!
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Display Section Header UICollectionReusableView
    I was working on iOS application and I have several problem about using UICollectionView cell. This time, I want to ask about how to display the section header of UICollectionView (UICollectionReusableView) I already implement the function like below : public func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { switch kind { case UICollectionElementKindSectionHeader: let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "cellHeader"
  • 如何在 UICollectionView 的部分标题中动态添加标签和按钮?(How to dynamically add labels and buttons in section header of UICollectionView?)
    问题 请帮助我如何水平添加标签和水平添加类似的按钮,但每个按钮应该像另一个部分一样在每个标签的下方对齐。 这应该在 UICollectionView 的标题中动态发生,因为标签和按钮的数量取决于我的数据。 我想制作一种 excel 布局,并在标题中显示上述控件。 提前致谢! 我已经这样做了- - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if (kind == UICollectionElementKindSectionHeader) { DepartmentCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath
  • 如何在 UICollectionView 中添加部分标题?(How do I add a section title in UICollectionView?)
    问题 我需要在我的收藏视图中的每个部分上方都有一个标签。 我试过简单地将标签拖到原型单元上方的标题空间中,但每次运行应用程序时,标签都不可见。 有什么帮助吗? 回答1 要在 UICollectionView 的每个部分上方添加自定义标签,请按照以下步骤操作 在 UICollectionView 中启用部分标题 添加一个 UICollectionReusableView 类型的新文件在 storyboard 中,将 UICollectionViewCell 中的 section header 类更改为新添加的 UICollectionReusableView 类型的文件。 在情节提要中 UICollectionViewCell 的部分标题中添加标签将部分标题中的标签连接到 UICollectionReusableView 文件class SectionHeader: UICollectionReusableView { @IBOutlet weak var sectionHeaderlabel: UILabel! } 在 ViewController 中添加以下代码func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at
  • UICollectionView:以编程方式标题视图[关闭](UICollectionView: header view programmatically [closed])
    问题 关闭。 这个问题需要细节或清晰度。 它目前不接受答案。 想改善这个问题吗? 通过编辑此帖子添加详细信息并澄清问题。 7年前关闭。 改进这个问题 这就是我处理标题的方式。 // viewDidLoad [self.collectionView registerClass:[UICollectionViewCell class]forCellWithReuseIdentifier:@"Cell"]; [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; UICollectionViewFlowLayout *layout= [[UICollectionViewFlowLayout alloc]init]; self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, 390, 300) collectionViewLayout:layout]; layout.collectionView.backgroundColor
  • 带有自定义 UICollectionViewLayout 的 UICollectionView 部分的标题(Header of section in UICollectionView with custom UICollectionViewLayout)
    问题 我正在使用自定义布局处理UICollectionView 。 两天后,我无法理解如何向UICollectionView添加标题。 我有非常简单的视图控制器(在故事板中使用自定义布局创建): class ACollectionViewController: UICollectionViewController { enum Identifiers: String { case CellIdentifier = "Cell" case HeaderIdentifier = "Header" } override func viewDidLoad() { super.viewDidLoad() self.collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: Identifiers.HeaderIdentifier.rawValue) } // MARK: UICollectionViewDataSource override func numberOfSectionsInCollectionView(collectionView
  • 滚动条错误地出现在 UICollectionView 部分标题下方(Scrollbar incorrectly appears underneath UICollectionView section header)
    问题 出于某种原因,我的滚动条总是出现在集合视图部分标题下方。 任何帮助是极大的赞赏! 回答1 我找到了一个解决方法。 此问题是集合视图错误地设置了标题视图的zPosition 。 为了解决这个问题,我们将始终确保zPosition是我们想要的值。 创建一个CALayer子类,以防止zPosition为 0 以外的任何值。 class CustomLayer: CALayer { override var zPosition: CGFloat { get { return 0 } set {} } } 然后将集合视图标题的图层类设置为这个新的子类。 class MyHeaderView: UICollectionReusableView { // your other custom code here override class var layerClass: AnyClass { get { return CustomLayer.self } } } 这是一个 iOS 11 错误,因为此问题不会在 iOS 10 中发生。希望在修复错误之前这能正常工作。 回答2 相同的概念,但这里有一个更简单的解决方法,不需要您的UICollectionReusableView实例使用子类。 符合UICollectionViewDelegate (如果您还没有)并实现
  • 如何在集合视图中快速创建页眉和页脚(How to make both header and footer in collection view with swift)
    问题 如何快速使集合视图中的页眉和页脚同时显示? 我试图将页眉和页脚组合在一起,但是它一直崩溃,我找不到快速的教程来理解它。 我不怎么为两个人返回补充观点,而只是返回一个观点。 我将它们都设置在情节提要上(类+标识符) override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { //#warning Incomplete method implementation -- Return the number of sections return 2 } override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { //#warning Incomplete method implementation -- Return the number of items in the section return 10 } override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind
  • 未调用 UICollectionReusableView 方法(UICollectionReusableView method not being called)
    问题 我希望UICollectionView部分具有带有图像的标题。 我已按照以下步骤操作: 在故事板中,为我的UICollectionView分配了一个标题作为附件给它一个标识符为它创建了UICollectionReusableView的子类将自定义类分配给故事板中的类。 将ImageView放在标题附件上在.h文件中的自定义类中为ImageView制作了一个插座在viewDidLoad实现以下viewDidLoad : [self.collectionView registerClass:[ScheduleHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerIdentifier]; -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableview = nil; if
  • How to dynamically add labels and buttons in section header of UICollectionView?
    Please help me how I can add labels horizontally and similarly buttons horizontally but each button should align at down of each label like a another section. This should happen dynamically in the header of the UICollectionView as the number of labels and buttons is according to my data. I want to make a excel kind of layout and in header I want to show the above controls. Thanks in advance! I have done this- - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
  • DiffableDataSource: Snapshot Doesn't reload Headers & footers
    I am using UICollectionViewDiffableDataSource for UICollectionView to display content in multiple sections. I am using Collection View Compositional Layout and Diffable Datasources link which was introduced at WWDC'19 to render the Multiple Section Layout of UICollectionView I have a simple setup, The Header for each section shows number of items in that section, and Footer shows the summary of all items of the section. section 1 Header --> January 2020 - 5 Trips section 1 item 1 --> Trip 1 section 1 item 2 --> Trip 2 section 1 item 3 --> Trip 3 section 1 item 4 --> Trip 4 section 1 item 5 -->
  • 如果节标题被隐藏在UICollectionView中,则删除空白空间(Removing empty space, if the section header is hidden in the UICollectionView)
    问题 我在UICollectionView有两个部分。 我只想在UICollectionView显示第1部分的部分标题。 不在第0部分。 因此,我试图在viewForSupplementaryElementOfKind返回nil : section == 0方法,并返回section == 1视图。 它崩溃并显示以下错误: Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes]: 这是我的补充视图代码。 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *sectionHeader = nil; if (kind == UICollectionElementKindSectionHeader && indexPath
  • UICollectionView多个节和标题(UICollectionView Multiple Sections and Headers)
    问题 我正在努力尝试在集合视图中使用每个部分的标头来做多个部分。 我不了解Obj-C,并且已经找到了很多教程,但是还没有弄清楚如何将其转换为Swift。 我所有的数据都是静态的,因此我所需要的只是某种可用于创建多个部分的数组或字典。 我已经有一个工作在1个部分的集合视图,因此,如果您对多个部分有任何见识或代码,将对您有所帮助。 我知道如何使用设置多个部分 func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return sectionData.count } 我认为我需要帮助的主要事情是实现此功能 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { } 并设置数据! UICollectionView和UITableView几乎完全相同,因此,如果您知道如何在Swift中的UITableView中执行多个部分,那么也将感谢您的帮助 回答1 cellForItemAtIndexPath函数处理用单元格填充每个节,它不处理节或SupplementaryViews,因此在创建节标题时
  • Removing empty space, if the section header is hidden in the UICollectionView
    I have two sections in UICollectionView. I want to show a section header in UICollectionView for only 1st section. Not in 0th section. So I tried to return nil in viewForSupplementaryElementOfKind: method for section == 0 and returns view for the section == 1. It crashes and shows below error: Assertion failure in -[UICollectionView _createPreparedSupplementaryViewForElementOfKind:atIndexPath:withLayoutAttributes:applyAttributes]: Here it is my code for the supplementary view. - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind
  • 基于UILabel的动态UICollectionView标头大小(Dynamic UICollectionView header size based on UILabel)
    问题 我读了很多关于将标头添加到UICollectionView的帖子。 在Swift中的iOS 7+应用中,我试图添加带有UILabel的标题,标题的高度应根据UILabel的高度进行调整。 UILabel的行数= 0。 我已经使用AutoLayout在IB中设置了标题 ViewController实现UICollectionViewDelegate, UICollectionViewDataSource 。 我没有为标题设置自定义类,但正在使用以下两个功能: func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { //description is a String variable defined in the class let size:CGSize = (description as NSString).boundingRectWithSize(CGSizeMake(CGRectGetWidth(collectionView.bounds) - 20.0, 180.0), options
  • add custom header to collection view swift
    问题 我正在尝试使用自定义 xib 文件将标题添加到collectionView 。 我使用实现UICollectionReusableView的类创建了xib文件。 在collectionViewController我注册了xib文件,如下所示: self.collectionView.register(UINib(nibName: HCollectionReusableView.nibName, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HCollectionReusableView.reuseIdentifier) 然后在viewForSupplementaryElementOfKind我做了 let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HCollectionReusableView.reuseIdentifier, for: indexPath) as! HCollectionReusableView 和尺寸
  • UICollectionView 带有部分标题,如 UITableView(UICollectionView with section headers like a UITableView)
    问题 我有一个简单的问题,是否有人能够在 CollectionView 中成功创建和实现类似于 TableView 中的标题的节标题? 我做了很多研究,找到了一些代码片段,但没有成功实现这一目标的任何人的真实例子。 我有照片的 CollectionView,我想要实现的是根据拍摄月份将它们分组。 我已经设法将它们分成这些部分,但我现在拥有的只是每个部分开头上方的空白标题。 我想要做的是在那些当前空白的标题中显示月份。 与每个部分的字母在显示联系人的 Tableview 中显示的方式相同。 感谢您提前回复。 回答1 在 Storyboard 中启用部分页眉/页脚视图。 实现collectionView:viewForSupplementaryElementOfKind方法。 看这个链接 回答2 通过以下设置在集合视图中添加节标题对我有用: 添加一个 xib 文件来定义标题视图内容。 xib 文件仅包含一种单元格类型定义。 就我而言,标题视图有一个自定义类型 (ImageCollectionViewHeaderCell),它派生自 UICollectionViewCell。 我认为这是必需的,但我不确定。 单元标识符也设置为预定义的字符串(例如)“ImageCollectionViewHeaderCellId” 为自定义类型添加头文件和实现文件。 有一种方法可以方便地获取其 UINIb
  • 添加一个简单的UIView作为UICollectionView的标题(Add a simple UIView as header of UICollectionView)
    问题 我有一个UICollectionView 。 我想添加一个标题。 我的标头只能是UILabel 。 我有 : 1)在IB中选择“ Section Header”作为Collection View附件。 2)在IB的一侧创建了一个Collection Reusable View,声明为collectionViewHeader 。 3)添加了这些行: - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if (kind == UICollectionElementKindSectionHeader) { return collectionViewHeader; } return nil; } 但是他们从来没有被召唤过。 我是否必须为该标签创建一个类才能使用 [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind
  • 水平设置 UICollectionView 的标头时应用程序崩溃(Application crash when set header of UICollectionView horizontally)
    问题 我在 UICollectionView 中很新。 我真的很累,想找出解决办法。 我正在尝试在 3 个水平行中添加标题。 我正在使用集合视图流布局。 这是我实现的代码: - (void)awakeFromNib { self.collectionView.backgroundColor = [UIColor colorWithRed:204.0/255.0 green:204.0/255.0 blue:204.0/255.0 alpha:1.0]; self.collectionView.backgroundColor = [UIColor clearColor]; self.collectionView.backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; flowLayout.itemSize = CGSizeMake(130.0, 170.0); [self.collectionView
  • UICollectionView: header view programmatically [closed]
    Closed. This question needs details or clarity. It is not currently accepting answers. Want to improve this question? Add details and clarify the problem by editing this post. Closed 7 years ago. Improve this question This is the way i am working on header. // viewDidLoad [self.collectionView registerClass:[UICollectionViewCell class]forCellWithReuseIdentifier:@"Cell"]; [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; UICollectionViewFlowLayout *layout= [
  • Header of section in UICollectionView with custom UICollectionViewLayout
    I'm working on UICollectionView with custom layout. In two days I cannot understand how add header to UICollectionView. I've got very simple view controller (created in storyboard with custom layout): class ACollectionViewController: UICollectionViewController { enum Identifiers: String { case CellIdentifier = "Cell" case HeaderIdentifier = "Header" } override func viewDidLoad() { super.viewDidLoad() self.collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: Identifiers.HeaderIdentifier.rawValue) } //