web-dev-qa-db-fra.com

Comment définir UICollectionViewCell Width et Height par programmation

J'essaie d'implémenter une CollectionView. Lorsque j'utilise Autolayout, mes cellules ne changent pas la taille, mais leur alignement.

Maintenant, je préférerais changer leur taille, par exemple.

//var size = CGSize(width: self.view.frame.width/10, height: self.view.frame.width/10)

J'ai essayé de mettre dans ma CellForItemAtIndexPath

collectionCell.size = size

cela n'a pas fonctionné cependant.

Y a-t-il un moyen d'y parvenir?

modifier :

Il semble que les réponses ne changeront que la largeur et la hauteur de ma collectionView. Existe-t-il un conflit dans les contraintes possibles? Des idées à ce sujet?

41
JVS

Utilisez cette méthode pour définir la largeur de hauteur de cellule personnalisée.

Assurez-vous d'ajouter ce protocole

UICollectionViewDelegate

UICollectionViewDataSource

UICollectionViewDelegateFlowLayout

Objectif c

@interface YourViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(CGRectGetWidth(collectionView.frame), (CGRectGetHeight(collectionView.frame)));
}

Swift 4 ou plus tard

extension YourViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

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

}
80
PinkeshGjr

Assurez-vous d’ajouter le protocole UICollectionViewDelegateFlowLayout dans votre déclaration class

class MyCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
{
    //MARK: - UICollectionViewDelegateFlowLayout

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

Vous avez enfin la réponse… .. Vous devriez prolonger UICollectionViewDelegateFlowLayout 
Cela devrait fonctionner avec les réponses ci-dessus. 

18
saburo

Swift 4.1

Vous avez 2 possibilités pour changer la taille de CollectionView.
Première manière -> ajouter ce protocole UICollectionViewDelegateFlowLayout 
pour Dans mon cas, je veux diviser la cellule en 3 parties dans une ligne. J'ai fait ce code ci-dessous

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource ,UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
            // In this function is the code you must implement to your code project if you want to change size of Collection view
            let width  = (view.frame.width-20)/3
            return CGSize(width: width, height: width)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
        if let label = cell.viewWithTag(100) as? UILabel {
            label.text = collectionData[indexPath.row]
        }
        return cell
    }
}

Deuxième manière -> vous n'avez pas devez ajouter UICollectionViewDelegateFlowLayout mais vous devez écrire du code dans la fonction viewDidload à la place du code ci-dessous

class ViewController: UIViewController {
@IBOutlet weak var collectionView1: UICollectionView!
        var collectionData = ["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."]

    override func viewDidLoad() {
        super.viewDidLoad()
        let width = (view.frame.width-20)/3
        let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: width, height: width) 
    }
}


extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
        if let label = cell.viewWithTag(100) as? UILabel {
            label.text = collectionData[indexPath.row]
        }

        return cell
    }
}

Quoi que vous écriviez un code comme premier ou deuxième moyen, vous obtiendrez le même résultat que ci-dessus. Je l'ai écrit. Cela a fonctionné pour moi

 enter image description here

7
Sup.Ia

Rapport de taille en fonction de la taille de l'iPhone:

Voici ce que vous pouvez faire pour avoir différentes largeurs et hauteurs de cellules en fonction de la taille de l'iPhone: 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 12 * 3) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

Et peut-être devriez-vous également désactiver vos contraintes de mise en forme automatique sur la cellule pour que cette réponse fonctionne. 

7
AnthoPak

La vue de collection contient un objet layout. Dans votre cas, il s’agit probablement d’une disposition flow ( UICollectionViewFlowLayout ). Définissez la propriété itemSize de la présentation de flux. 

6
matt

dans Swift3 et Swift4 vous pouvez modifier la taille de la cellule en ajoutant UICollectionViewDelegateFlowLayout et en implémentant la structure suivante: 

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

ou si vous créez UICollectionView par programme, vous pouvez le faire comme suit:

    let layout = UICollectionViewFlowLayout()
                    layout.scrollDirection = .horizontal //this is for direction
                    layout.minimumInteritemSpacing = 0 // this is for spacing between cells
                    layout.itemSize = CGSize(width: view.frame.width, height: view.frame.height) //this is for cell size
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout)
3
Mohsen mokhtari

Swift4 Swift 4 collection ios voir exemple collectionview xcode dernier code exemple de travail

Ajoutez ceci dans la section des délégués du haut 

UICollectionViewDelegateFlowLayout 

et utiliser cette fonction

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 20) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

/////sample code complet

créer sur la vue de collection et la cellule collectionview dans le storyboard donner une référence à la collection
@IBOutlet faible cvContent var: UICollectionView!

coller ceci dans le contrôleur de vue 

import UIKit

classe ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

var arrVeg = [String]()
var arrFruits = [String]()
var arrCurrent = [String]()

@IBOutlet weak var cvContent: UICollectionView!



override func viewDidLoad() {
    super.viewDidLoad()
    arrVeg = ["Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato"]

    arrVeg = ["Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange"]


    arrCurrent = arrVeg
}
//MARK: - CollectionView



func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 20) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

func numberOfSections(in collectionView: UICollectionView) -> Int {

    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


    return arrCurrent.count
}



func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ContentCollectionViewCell
    cell.backgroundColor =  UIColor.green
    return cell
}

}

3
Ullas Kumar

Swift 5 par programme

lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal

        //Provide Width and Height According to your need
        let cellWidth = UIScreen.main.bounds.width / 10
        let cellHeight = UIScreen.main.bounds.height / 10
        layout.itemSize = CGSize(width: cellWidth, height: cellHeight)

        //You can also provide estimated Height and Width
        layout.estimatedItemSize = CGSize(width: cellWidth, height: cellHeight)

        //For Setting the Spacing between cells
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0

        return UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    }()
2
Shubham Mishra

Essayez la méthode ci-dessous

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: 100.0, height: 100.0)
}
2
Nilesh Patel

Une autre méthode consiste à définir la valeur directement dans la présentation du flux. 

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: size, height: size)
0
Antzi