16

コレクション ビューがあり、各セクションにヘッダーとフッターの両方が必要です。デフォルトのフロー レイアウトを使用しています。

独自のサブクラスがあり、View ControllerUICollectionReusableViewのメソッドでヘッダーとフッターの両方にそれぞれ登録します。viewDidLoad

私はメソッドを実装しましたcollectionView:viewForSupplementaryElementOfKind:atIndexPath:が、セクションごとに、それはkindbeingでのみ呼び出されUICollectionElementKindSectionHeaderます。したがって、私のフッターも作成されません。

なぜこれが起こるのですか?

4

3 に答える 3

12

footerReferenceSizeコレクションビューのレイアウトを設定する必要があるようです。ヘッダーでそれをする必要がなかったのは奇妙です。

于 2012-11-02T08:43:13.990 に答える
9

(Swift 3.1、Xcode 8.3.3 を使用)
まず、ヘッダーのクラスまたは nib を登録します。

collectionView.register(ShortVideoListHeader.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header")

第二に、設定しheaderReferenceSizeます。headerReferenceSizeまたは、 collectionView のデリゲートで返すこともできます

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.headerReferenceSize = CGSize(width: view.bounds.width, height: 156)
}

3 番目に、次のような独自のヘッダー クラスを記述します。

class ShortVideoListHeader: UICollectionReusableView {
    let titleLabel = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(titleLabel)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        titleLabel.sizeToFit()
        titleLabel.frame.origin = CGPoint(x: 15, y: 64 + (frame.height - 64 - titleLabel.frame.height) / 2) // navigationBar's height is 64
    }
}

4 番目に、collectionView の dataSource メソッドでヘッダー インスタンスを返します。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionElementKindSectionHeader:
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "header", for: indexPath) as! ShortVideoListHeader
        header.titleLabel.text = title
        header.setNeedsLayout()
        return header

    default:
        return UICollectionReusableView()
    }
}

ちなみに、セクションヘッダーを非表示にする方法については、 Apple のドキュメントに回答があります。

このメソッドは常に有効なビュー オブジェクトを返す必要があります。特定のケースで補助ビューが必要ない場合は、レイアウト オブジェクトでそのビューの属性を作成しないでください。または、対応する属性の hidden プロパティを YES に設定するか、属性の alpha プロパティを 0 に設定して、ビューを非表示にすることもできます。フロー レイアウトでヘッダー ビューとフッター ビューを非表示にするには、それらのビューの幅と高さを設定することもできます。 0に。

于 2017-09-11T08:40:00.007 に答える