web-dev-qa-db-ja.com

collectionViewサイズを設定します。 (sizeForItemAtIndexPath関数が機能していません)Swift 3

tableViewがあり、すべてのtableViewCellcollectionViewです。

私はこのコードでcollectionViewのサイズを変更しようとしています:

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

    if collectionView.tag == 2{

        return CGSize(width: 100, height: 100)

    }else if collectionView.tag == 4 {


        return CGSize(width: 222, height: 200)

    }else{


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

}

問題は、エラーはないがセルのサイズが変わらないことです

もっと知りたい場合は、コメントを書いてください。

ありがとうございました。

22
0ndre_

これが今の私のコードであり、動作します:

        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.tag = row
        collectionView.setContentOffset(collectionView.contentOffset, animated:false)
        collectionView.reloadData()
        collectionView.register(UINib(nibName: "eventsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "eventsCollectionViewCell")


        if row == 2{


            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 120, height: 120)
            layout.scrollDirection = .horizontal

            collectionView.collectionViewLayout = layout

        }else if row == 4 {


            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 222, height: 200)
            layout.scrollDirection = .horizontal

            collectionView.collectionViewLayout = layout

        }else{

            print("else")
        }
2
0ndre_

このメソッドのシグネチャは、Swift 3で次のように変更されました。

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    // your code here
}

微妙な違いに注意してください:(_ collectionView: ...の代わりに(collectionView: ...

これは、Swift 3)では、最初のパラメーターのラベルを明示的に指定する必要があるためです。アンダースコア文字_を追加することで、このデフォルトの動作をオーバーライドできます。

また、クラスがUICollectionViewDelegateUICollectionViewDelegateFlowLayoutの両方のプロトコルを採用していることを確認してください

class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {

    // your code here

    func collectionView(_ collectionView: UICollectionView,
                layout collectionViewLayout: UICollectionViewLayout,
                sizeForItemAt indexPath: IndexPath) -> CGSize {
        // your code here
    }
}

Swift 3.の変更の詳細については、 このリンク を参照してください。

59
Pedro Mancheno

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

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
18
Vikas Krishnan

ショートバージョン

追加してみてください

collectionView.delegate = dataSource

より長いバージョン

私にとってこれは小さな間違いでした-

collectionView.dataSource = self

これにより、これらのメソッドが呼び出されます

func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

しかし、それは[〜#〜] not [〜#〜]呼び出します

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

これはUICollectionViewのdataSourceの一部ではないためです。 UICollectionViewのデリゲートの一部です。

そこで、以下を追加することで問題を解決しました。

collectionView.delegate = dataSource
3
BLC

私も同じ問題を抱えています!サイズを幅の半分(width/2)にすると、paddingがwidth/2に追加されるため、幅全体のように表示されます。

修正:ストーリーボードのセクションインセットを必ず0に設定してください。または、width/2をセクションインセットを含むサイズに調整してください。

それを修正するにはしばらく時間がかかりました;-)

0
t.berlin