J'ai un tableView
et dans chaque tableViewCell
est un collectionView
.
J'essaie de changer la taille de la collection avec ce code:
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)
}
}
Le problème est qu'il n'y a pas d'erreur mais que les cellules ne changent pas de taille
Si vous souhaitez en savoir plus, écrivez simplement un commentaire.
Merci.
Donc, ceci est mon code en ce moment et cela fonctionne:
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")
}
La signature de cette méthode a été modifiée dans Swift 3 en:
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
Faites attention à la différence subtile: (_ collectionView: ...
au lieu de (collectionView: ...
.
En effet, dans Swift 3, vous devez spécifier explicitement le libellé du premier paramètre. Vous pouvez remplacer ce comportement par défaut en ajoutant le caractère de soulignement _
.
Assurez-vous également que votre classe adopte les deux protocoles UICollectionViewDelegate
et UICollectionViewDelegateFlowLayout
.
class MyViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
// your code here
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// your code here
}
}
Reportez-vous à ce lien pour en savoir plus sur les modifications apportées à Swift 3.
Vous devez spécifier que vous implémentez le protocole UICollectionViewDelegateFlowLayout dans votre déclaration de classe.
class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
version courte:
Essayez d'ajouter
collectionView.delegate = dataSource
Version plus longue:
Pour moi, c'était une petite erreur -
collectionView.dataSource = self
Cela appellerait ces méthodes
func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
Cependant, il serait PAS appeler
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize
Parce que cela ne fait pas partie de la source de données de UICollectionView. Cela fait partie du délégué de UICollectionView.
L'ajout de ce qui suit a résolu mon problème.
collectionView.delegate = dataSource
J'ai eu le même problème! Si vous donnez la taille à la moitié de la largeur (largeur/2), elle apparaîtra comme toute la largeur car le remplissage est ajouté à la largeur/2.
Solution: assurez-vous de définir les incrustations de section dans Storyboard sur 0. Vous pouvez également ajuster la largeur/2 à une taille INCLUANT les incrustations de section.
Il m'a fallu un certain temps pour résoudre ce problème ;-)