Swift UICollectionView 标头未正确显示

Posted

技术标签:

【中文标题】Swift UICollectionView 标头未正确显示【英文标题】:Swift UICollectionView header not appearing properly 【发布时间】:2015-10-15 19:25:42 【问题描述】:

UICollectionView 的标题显示不正确。我在标题中添加了一个 UILabel,它应该显示节号。当我调试 viewForSupplementaryElementOfKind 时,一切看起来都很好。我查看了有关 collectionView 标头的不同教程,但在我的代码中找不到错误。

这是完整的代码:

import UIKit

class ViewController: UIViewController 

    var collectionView:UICollectionView!;

    override func viewDidLoad() 
        super.viewDidLoad()

        let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout();
        layout.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20);
        layout.itemSize = CGSize(width: 60, height: 60);
        layout.headerReferenceSize = CGSize(width: CGRectGetWidth(self.view.bounds), height: 50);

        collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout);


        collectionView.dataSource = self;
        collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell");
        collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header");
        collectionView.delegate = self;
        self.view.addSubview(collectionView);

    



extension ViewController:UICollectionViewDataSource
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 5;
    

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
       return 10
    

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath);

        cell.backgroundColor = UIColor.whiteColor();

        return cell;
    




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

        let view = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "header", forIndexPath: indexPath)

        view.backgroundColor = UIColor.blueColor();


        let label = UILabel(frame: view.frame);
        label.text = String(indexPath.section);
        label.font = UIFont(name: "helvetica", size: 40);
        label.textAlignment = .Center;
        view.addSubview(label);



        return view;

    



【问题讨论】:

这不是问题的根源,但很重要:您没有掌握 collectionView.dequeueReusableSupplementaryViewOfKind 返回一个 可重用 视图。这句话很重要。此视图可能与已用于另一个标题的视图相同。如果是这样,您不想再次添加标签。 【参考方案1】:

换行

let label = UILabel(frame: view.frame);

let label = UILabel(frame: view.bounds);

尽管您应该注意,您需要解决代码中有关重用补充视图的其他问题。我建议创建一个 UICollectionReusableView 的子类,其中包含一个标签,而不是从您的数据源手动添加一个新标签。

【讨论】:

以上是关于Swift UICollectionView 标头未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 的标头中使用分段控件更改 UICollectionView 的内容

基于UILabel的动态UICollectionView标头大小

iOS版;以编程方式uicollectionView与自定义标头

Swift - UICollectionView:如何在标题中自动布局标签间距

保留对 UICollectionView 标头的引用

UICollectionView 标头未显示