web-dev-qa-db-fra.com

Définir la taille de la collection. (la fonction sizeForItemAtIndexPath ne fonctionne pas) Swift 3

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.

22
0ndre_

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")
        }
2
0ndre_

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.

59
Pedro Mancheno

Vous devez spécifier que vous implémentez le protocole UICollectionViewDelegateFlowLayout dans votre déclaration de classe.

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
18
Vikas Krishnan

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
3
BLC

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 ;-)

0
t.berlin