web-dev-qa-db-fra.com

Comment changer la taille de UICollectionViewCell par programme dans Swift?

J'ai un UICollectionView avec un segmented control pour basculer entre les données. Mais comment puis-je modifier les propriétés de la taille UICollectionViewCell par programme ? je peux alors personnaliser chaque style de manière appropriée pour chaque type de données.

Par exemple changez la largeur à 520 points et la hauteur à 100. Je suis nouveau dans le développement iOS et j'ai de l'expérience en CSS: /

Je sais comment le faire dans Xcode (évidemment) mais je ne connais pas les méthodes correctes pour le changer dans Swift. Toutes les idées ou commentaires sont très appréciés (Y)

enter image description here

48
RileyDev

Assurez-vous de vous conformer à UICollectionViewDelegateFlowLayout pour votre classe (pour Swift4).

eg. class MyClass: UICollectionViewDelegateFlowLayout

Avant Swift 3

//Use for size
func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    }
//Use for interspacing
    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

    func collectionView(collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
        minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
            return 1.0
    }

// Pour Swift 3

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

}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

// Pour Swift 4

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

        }

        func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }

        func collectionView(_ collectionView: UICollectionView, layout
            collectionViewLayout: UICollectionViewLayout,
                            minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 1.0
        }
    }

utilise le même code que celui indiqué ci-dessus pour Swift 3 mais juste assurez-vous que votre classe est conforme au protocole UICollectionViewDelegateFlowLayout

90
Sumit Oberoi

Swift

Méthodes de @ sumit-oberoi answer ne sera pas appelé si vous utilisez Swift 3. Pour que cela fonctionne, apportez les modifications suivantes:

  1. Conformez-vous au protocole UICollectionViewDelegateFlowLayout.

  2. Implémentez ces méthodes:

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
    
    }
    
    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1.0
    }
    

Notez les modifications:

  1. ajouter _ avant collectionView dans le nom de la méthode
  2. NSIndexPath devient IndexPath
61
JPetric

Swift

override func viewDidLoad() {
    super.viewDidLoad()

    let cellSize = CGSize(width:80 , height:80)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}
31
Gaurav Rami

si vous utilisez le code ci-dessous de Gaurav Rami

let cellSize = CGSize(width:80 , height:80)

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //.horizontal
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumLineSpacing = 1.0
layout.minimumInteritemSpacing = 1.0
myCollectionView.setCollectionViewLayout(layout, animated: true)

et obtenez ce message "L'instantané d'une vue qui n'a pas été rendue donne un instantané vide. Assurez-vous que votre affichage a été rendu au moins une fois avant l'instantané ou après la mise à jour de l'écran." vous devez le supprimer animé lors du réglage disposition de la vue pour la vue collection

myCollectionView.setCollectionViewLayout(layout, animated: false)

alors le message disparaîtra

6
Heo Đất Hades
first Conform protocol the UICollectionViewDelegateFlowLayout

set width and height  UICollectionViewCell 

UIcollectionViewCell Hight = 300;
UIcollectionViewCell Width = 380;

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {
      return CGSize(width: CGFloat((380)), height: CGFloat(300))
    }
0
Ananda Aiwale