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

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

ただいまの
回答率

87.91%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,341

score 83

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

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

//ViewController内コード

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
            //省略
    }


     func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        referenceSizeForHeaderInSection section: Int) -> CGSize{
        return CGSize(width: UIScreen.main.bouds.width, height: 400)
    }

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

//View内のコード

class PinterestView: UIView {
   var collectionView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height, collectionViewLayout: PinterestLayout())
        collectionView.register(PinterestCell.self, forCellWithReuseIdentifier: PinterestCell.identifier)
        collectionView?.register(PinterestHeader.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: PinterestHeader.identifier)
        //以降省略
    }

}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

extension ViewController: UICollectionViewDelegateFlowLayout {
  //省略
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/29 10:30

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

    キャンセル

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

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る