web-dev-qa-db-ja.com

UICollectionViewヘッダーが表示されない

UICollectionViewを使用していくつかのアルバムを表示するプロジェクトに取り組んでいます。項目は正常に表示されますが、最初のセクションの上にヘッダーを表示したいと思います。

これを行うために、registerNib:forSupplementaryViewOfKind:withReuseIdentifier:私のinitメソッドに。このような:

[self.collectionView registerNib:[UINib nibWithNibName:@"AlbumHeader" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kAlbumHeaderIdentifier];

AlbumHeaderペン先には、AlbumHeaderのサブクラスであるUICollectionViewクラスのビューが含まれています。)

その後、collectionView:viewForSupplementaryElementOfKind:atIndexPath 方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kAlbumHeaderIdentifier forIndexPath:indexPath];
}

ヘッダービューを読み込もうとするはずです。しかし、そうではなく、補足ビューのメソッドは呼び出されません。

私は何が欠けていますか?何時間も立ち往生し、UICollectionViewsのドキュメントを何度も読みましたが、何も役に立たないようです。何かご意見は?

41
Guido Hendriks

Yufが尋ねた方法を探した後、デフォルトでヘッダー/フッターのサイズが0,0であることを読みました。サイズが0の場合、ヘッダー/フッターは表示されません。

プロパティでサイズを設定できます:

flowLayout.headerReferenceSize = CGSizeMake(0, 100);

その場合、すべてのヘッダーは同じサイズになります。セクションごとに異なる必要がある場合は、UICollectionViewDelegateFlowLayoutプロトコルの一部である次のメソッドを実装できます。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    if (section == albumSection) {
        return CGSizeMake(0, 100);
    }

    return CGSizeZero;
}

垂直スクロールでは、返されたheightとコレクションビューの全幅を使用し、水平スクロールでは、戻りwidthとコレクションビューの全高を使用します。

114
Guido Hendriks

実装しましたか:

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

一つのことを機能させるためだけに実装するメソッドがたくさんあります...私も学んでいます。動作するかどうか教えてください。

編集:申し訳ありませんが間違った方法。それはサブクラス化のためだと思います。私が話しているのはUICollectionViewLayout(レイアウトが補助ビューをサポートする場合、サブクラス化するレイアウトオブジェクト)にあります:

- layoutAttributesForSupplementaryViewOfKind:atIndexPath:

こちらをご覧ください: https://developer.Apple.com/library/ios/#documentation/UIKit/Reference/UICollectionViewLayout_class/Reference/Reference.html#//Apple_ref/occ/cl/UICollectionViewLayout

2
yuf

Swift 3&Swift 4

    self.collectionView.register(UINib(nibName: "SectionCollectionReusableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "SectionCollectionReusableView")



    self.collectionView.fs_width = self.collectionView.bounds.width

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 70, left: 40, bottom: 0, right: 0)
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    layout.estimatedItemSize = CGSize(width: 350, height: 140)
    layout.scrollDirection = .horizontal
    layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)
    layout.sectionHeadersPinToVisibleBounds = true
    self.collectionView!.collectionViewLayout = layout

これをViewDidLoadに追加する必要があります。

layout.headerReferenceSize = CGSize(width: self.collectionView.bounds.size.width, height: 60)

これにより、ヘッダーのセクションレイアウトが作成されます。

そして、@ Guido Hendriksに感謝し、彼らの答えからも洞察を得ています