CollectionView sizeForItemAtIndexPathは呼び出されません


94

これは私を夢中にさせています!以下に示すように、UICollectionViewControllerがあります。

class PhrasesCompactCollectionViewController: UICollectionViewController

numberOfSectionsおよびcellForItemAtが呼び出されていますが、sizeForItemAtIndexPathが呼び出されることはありません。同じ正確なコードをどこかで使用していますが、正しく起動します。Xcode 8 Beta 6を使用しています。

func collectionView(collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAtIndexPath indexPath:  NSIndexPath) -> CGSize {

        return CGSize(width: 120, height:120) 
    }

回答:


251

UICollectionViewDelegateFlowLayoutクラス宣言でプロトコルを実装することを指定する必要があります。

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


10
私はこれをしましたが、まだ呼ばれていません。:(
Van Du Tran

57

スウィフト3+このメソッドを使用:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

クラスが両方のデリゲートに準拠していることを確認してください

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout


4
UICollectionViewDelegateUICollectionViewControllerが既に従うように準拠することは冗長です。
Van Du Tran

3
@VanDuTran UICollectionViewControllerである必要がないため、必須であると述べることは冗長ではありません...
Michael Hudson

非コレクションビューであるViewcontrollerをUICollectionViewDelegateにできることを意味していると思います。
ScottyBlades

1
UICollectionViewDelegateFlowLayoutはUICollectionViewDelegateを継承しているため、UICollectionViewDelegateFlowLayoutを実装するだけです
evya

46

私も同じ問題を抱えていました。私を助けた1つのことは、collectionViewサイズインスペクター「なし」の下でセルサイズの「推定サイズ」を作成することでした。

ここに画像の説明を入力してください


8
あなたは私の一日の仲間を救った、あなたはヒーローです
Asif Ali

1
どういうわけか、使用に関する他のすべての投稿に関する他のすべての回答は、sizeForItemAtこれについて言及することに失敗しました。非常に便利。
JCutting8

狂ってる!!!!iOSバージョン10.3.1のiPhone 5シミュレーターでテストし、メソッドが呼び出されました。10.3.1バージョンのiPhone 5sシミュレータでメソッドが呼び出されません!!! 見積もりサイズをなしに変更しました。それはiPhone 5sで呼ばれ始めました。WT WT WT
ハサン

どうもありがとう!カスタムを使用した私のコレクションビューは、sizeForItemAtXcode 11.4までうまく機能し、突然セルの幅が間違っていました。たくさんのことを試しましたが、これはようやく機能しました。
フィリップ

あなたは私の時間を節約しました。どうもありがとう。
Shahbaz Akram

15

スウィフト3

UICollectionViewのセルサイズを設定するには、のオブジェクトを作成してカスタマイズする必要がありますUICollectionViewFlowLayout。プロパティをカスタマイズし、そのレイアウトオブジェクトをUICollectionViewオブジェクトに設定します。

要件(必要なセルの高さと幅)に応じて、cellheightオブジェクトとcell cellWidthオブジェクトを変更します。

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}

確認してください:sizeForItemAt indexPathメソッドを追加した場合、メソッドを削除する必要があります...

以下のメソッドを削除

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

12
これはどのように役立ちますか?
アルマ2017

1
Almas、これは、UICollectionViewCellのカスタムセルサイズの設定に役立ちます...独自の値を定義できるという点で、変数cellWidthとcellHeightがあります。 。これらの変数はまたUICollectionViewCellサイズのために重要、「.minimumInteritemSpacing
のGauravラミ

2
これは、すべてのセルが同じサイズの場合にのみ機能します。以下の答えは正解です
JeffN

これは、UICollectionViewのサイズを変更するためのものですが、ビュー内のセルは変更しません
Async-

これは、デリゲートメソッドが呼び出されない理由に対する答えではありません
Ziv Kesten、

12

スウィフト5

これらのすべての手順が必要です

  1. UICollectionViewDelegateFlowLayoutに準拠 <==絶対に必要!!
  2. そして UICollectionViewDelegate, UICollectionViewDataSource
  3. viewDidLoadでこれらを設定しますcollectionView.delegate = selfと、collectionView.dataSource = self
  4. Interface BuilderでEstimate SizeをNoneに設定します
  5. 次のメソッドにsizeForItemAtIndexPathではなくsizeForItemAtがあることを確認してください

なので :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: 100, height:100)
} 

2
サイズをなしに見積もる-一日を節約しましょう!
Joe Hallenbeck

6

最初のクラスは、UICollectionViewDelegateFlowLayoutに確認する必要があります。次に、viewDidLoad()に次のコードを記述する必要があります。

// UICollectionViewにUIViewControllerのUICollectionViewDelegateFlowLayoutメソッドを使用するように指示する

collectionView.delegate = self

//独自のコレクションビューフローレイアウトを設定する場合

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

このコードを使用して、UICollectionViewDelegateFlowLayoutメソッド

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

呼び出されます。このメソッドでサイズを設定できます。


4

回答が機能しない場合に確認する必要がある3つのこと:

  1. FlowLayoutデリゲートを実装します。 class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. Swift 3.0以降のアイテムのサイズのメソッドを使用: func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }

  3. Estimate size = NoneUICollectionViewのInspect要素で選択します。


2

私は同じ問題を抱えていて、それを修正するものは何もありませんでした。レイアウトデリゲートによって定義された別の関数に近づいたため、プライベートにするという黄色の警告がありました。私にとってそれを修正したのは:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

「sizeForItemAtIndexPath」と正しい「sizeForItemAt」の違いに注意してください。

私はこれを理解しようと数日間髪を引き裂きました、そしてそれはついにうまくいきました。以下に、すべての関数を含めて、高さを0にしてセルを「非表示」にする方法を示します。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width

    if (findIndex! % 2 == 0){
        // Even index, show cell
        return CGSize(width: screenWidth, height: 246)
    }
    else {
        return CGSize(width: screenWidth, height: 0)
    }
}

0

昨夜この問題がありました。真夜中に 'didSelectItemAtIndex'メソッドが閉じ括弧 "}"で閉じられていないことに気付いたときに最後に解決しました

コンパイルエラーで尋ねられたときに、クラスの一番下にクロージャーブラケットを追加しました。したがって、実際には、 'didSelectItemAtIndex'の下のすべてのメソッドがそのメソッド内にありました。

他の誰かがこれに夜の4時間を無駄にした場合に備えて、ここに投稿します:-(


0

これをviewDidLoad()に入れてください

collectionView.delegate = self

0

私の問題は、UICollectionViewDataSourceオブジェクトをローカル変数として作成していたことです。したがって、コードでdataSourceオブジェクトを手動で初期化する場合は、必ずグローバル変数として保存してください。


0

この方法を使用

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

の代わりに

private func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

}

0

追加するだけ:UICollectionViewDelegateFlowLayout

class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}

-11

私(Swift 3.1)では、メソッドは次のようにpublicと宣言する必要があります。

    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       return CGSize()
    }

公開することを忘れないでください。


publicフレームワークとモジュールの間でコードにアクセスできるようにするために使用するものです。
ScottyBlades 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.