tableView
があり、すべてのtableViewCell
はcollectionView
です。
私はこのコードで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)
}
}
問題は、エラーはないがセルのサイズが変わらないことです
もっと知りたい場合は、コメントを書いてください。
ありがとうございました。
これが今の私のコードであり、動作します:
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")
}
このメソッドのシグネチャは、Swift 3で次のように変更されました。
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
微妙な違いに注意してください:(_ collectionView: ...
の代わりに(collectionView: ...
。
これは、Swift 3)では、最初のパラメーターのラベルを明示的に指定する必要があるためです。アンダースコア文字_
を追加することで、このデフォルトの動作をオーバーライドできます。
また、クラスがUICollectionViewDelegate
とUICollectionViewDelegateFlowLayout
の両方のプロトコルを採用していることを確認してください
class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
// your code here
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
}
Swift 3.の変更の詳細については、 このリンク を参照してください。
クラス宣言でプロトコルUICollectionViewDelegateFlowLayoutを実装することを指定する必要があります。
class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
ショートバージョン:
追加してみてください
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
私も同じ問題を抱えています!サイズを幅の半分(width/2)にすると、paddingがwidth/2に追加されるため、幅全体のように表示されます。
修正:ストーリーボードのセクションインセットを必ず0に設定してください。または、width/2をセクションインセットを含むサイズに調整してください。
それを修正するにはしばらく時間がかかりました;-)