質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

712閲覧

【Swift3】CollectionViewにHeaderを追加したい

Kesth

総合スコア83

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2017/07/26 16:11

編集2022/01/12 10:55

こんばんは。
現在、下記の記事を参考にしてPinterestライクなUIを実装しています。
http://qiita.com/eKushida/items/8f8965467d098ca05120

その上で、上記記事中の記事をほぼそのまま活用することで
Piterestライクなグリッドレイアウトが実現できたのですが
これに対して、Headerをどのようにつければよいかわからず悩んでいます。
ViewController内にcollectionView.delegate = selfとした上で
下記のコードを記載しているのですが、そもそも呼ばれていないようです。

Swift

1//ViewController内コード 2 3 func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 4 //省略 5 } 6 7 8 func collectionView(_ collectionView: UICollectionView, 9 layout collectionViewLayout: UICollectionViewLayout, 10 referenceSizeForHeaderInSection section: Int) -> CGSize{ 11 return CGSize(width: UIScreen.main.bouds.width, height: 400) 12 }

Viewのコードは以下のようになっており、CollectionViewをイニシャライズするときに
上記Qiitaのコードに記載のPinterestLayout.swiftのコードをそっくりもってきたPinterestLayout()
というClassをLayoutとして引数に当てています。
後半で、CollectionViewのCellとHeaderに当たるclassを登録しています。

Swift

1//View内のコード 2 3class PinterestView: UIView { 4 var collectionView! 5 6 override init(frame: CGRect) { 7 super.init(frame: frame) 8 collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height, collectionViewLayout: PinterestLayout()) 9 collectionView.register(PinterestCell.self, forCellWithReuseIdentifier: PinterestCell.identifier) 10 collectionView?.register(PinterestHeader.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: PinterestHeader.identifier) 11 //以降省略 12 } 13 14} 15

その上で、通常の場合、UICollectionViewFlowLayoutをイニシャライズした上で
layout.headerReferenceSize = CGSize()といった記載をすることで、Headerの高さを
定義すると思うのですが、今回の場合
①UICollectionViewFlowLayoutを外部ファイルにおいてしまっている
②Headerの高さが中身に応じて動的に可変となる
となっているため、おそらくPinterestLayout()の中で何らかの記載をする必要があると考えています。

つきましては、PinterestLayout()内のどこにどのようなコードを書けば
Headerが正常に表示されるようになるのか、アドバイスいただけないでしょうか。
PinterestLayout()については、冒頭で記載したQiitaの記事中のコードと考えていただいて構いません。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

このメソッド、ViewController()内で補完されない状態ではないですか?
func collectionView(UICollectionView, layout: UICollectionViewLayout, referenceSizeForHeaderInSection: Int)

上記メソッドは UICollectionViewDelegateFlowLayout プロトコルで定義されているメソッドなので、
ViewController にプロトコルを適用させないと呼ばれないはずです。

extension ViewController: UICollectionViewDelegateFlowLayout { //省略 }

参考:
UICollectionViewDelegateFlowLayout - UIKit | Apple Developer Documentation
UICollectionView の Layout で悩んだら

投稿2017/07/28 19:30

umeruma

総合スコア137

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kesth

2017/07/29 01:30

ご回答ありがとうございます。はい、referenceSizeForHeaderInSectionがViewController内で保管されない状態です。その上で、ご指摘の通り、extensionを使ってみましたが、それでも呼ばれない状態でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問