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
...で物事はとても複雑です.
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)
そうでない場合、データソースメソッドは呼び出されません
ストーリーボードでヘッダービューを設定しない場合、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;
}
また、ヘッダービューが表示されるように、コレクションビューまたはフローレイアウトでヘッダーサイズを設定することを忘れないでください。