web-dev-qa-db-ja.com

UICollectionViewのヘッダーとして単純なUIViewを追加します

UICollectionViewがあります。ヘッダーを追加したいと思います。私のヘッダーはUILabelのみです。私がした:

1)IBでコレクションビューアクセサリとして「セクションヘッダー」を選択しました。

2)collectionViewHeaderとして宣言されている側で、IBにコレクション再利用可能ビューを作成しました。

3)これらの行を追加しました:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    if (kind == UICollectionElementKindSectionHeader) {

            return collectionViewHeader;
    }
    return nil;
}

しかし、それらは呼び出されません。

使用するためにそのラベルのためだけにクラスを作成する必要がありますか

[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];

必要なヘッダーをドラッグアンドドロップするだけのUITableViewほど単純ではないのはなぜですか。 UICollectionView...で物事はとても複雑です.

30
Nicolas Roy

In Swift以下のように

ヘッダービューの登録

collectionView.registerClass(HeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView")

UICollectionViewDataSource

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

    let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", forIndexPath: indexPath)

    headerView.frame.size.height = 100

    return headerView
}

重要なのは、フローレイアウトにヘッダーサイズを指定することです

flowLayout.headerReferenceSize = CGSize(width: self.collectionView.frame.size.width, height: 100)

そうでない場合、データソースメソッドは呼び出されません

39
Eike

ストーリーボードでヘッダービューを設定しない場合、nibを登録する必要があります。

ViewDidLoadの例:

- (void)viewDidLoad
{
    [self.collectionView registerClass:NSStringFromClass([YourOwnSubClass class]) forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderViewIdentifier"];
}

とにかく、UICollectionReusableViewをサブクラス化することもできます。

@interface YourOwnSubClass : UICollectionReusableView

次に、クラスの例でデリゲートを呼び出します。

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
           viewForSupplementaryElementOfKind:(NSString *)kind
                                 atIndexPath:(NSIndexPath *)indexPath
{

    YourOwnSubClass *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:
                                         UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];    
    [self updateSectionHeader:headerView forIndexPath:indexPath];

    return headerView;
}

- (void)updateSectionHeader:(UICollectionReusableView *)header forIndexPath:(NSIndexPath *)indexPath
{
    NSString *text = [NSString stringWithFormat:@"header #%i", indexPath.row];
    header.label.text = text;
}

また、ヘッダービューが表示されるように、コレクションビューまたはフローレイアウトでヘッダーサイズを設定することを忘れないでください。

20
Raz