J'essaie d'ajouter UICollectionView
à ViewController
, et j'ai besoin d'avoir 3 cellules «par ligne» sans espace vide entre les cellules (cela devrait ressembler à une grille). La largeur de la cellule doit être un tiers de la taille de l'écran, j'ai donc pensé que la layout.item
largeur devait être la même. Mais alors je comprends ceci:
Si je réduis cette taille (de 7 ou 8 pixels par exemple), c'est mieux, mais la troisième cellule de la rangée n'est pas complètement visible, et j'ai toujours cet espace vide (haut et bas, gauche et droite).
class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
var collectionView: UICollectionView?
var screenSize: CGRect!
var screenWidth: CGFloat!
var screenHeight: CGFloat!
override func viewDidLoad() {
super.viewDidLoad()
screenSize = UIScreen.mainScreen().bounds
screenWidth = screenSize.width
screenHeight = screenSize.height
// Do any additional setup after loading the view, typically from a nib
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
layout.itemSize = CGSize(width: screenWidth / 3, height: screenWidth / 3)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView!.dataSource = self
collectionView!.delegate = self
collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
collectionView!.backgroundColor = UIColor.greenColor()
self.view.addSubview(collectionView!)
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 20
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as CollectionViewCell
cell.backgroundColor = UIColor.whiteColor()
cell.layer.borderColor = UIColor.blackColor().CGColor
cell.layer.borderWidth = 0.5
cell.frame.size.width = screenWidth / 3
cell.frame.size.height = screenWidth / 3
cell.textLabel?.text = "\(indexPath.section):\(indexPath.row)"
return cell
}
}
Réponses:
Ajoutez ces 2 lignes
Donc vous avez:
Cela supprimera tous les espaces et vous donnera une disposition en grille:
Si vous souhaitez que la première colonne ait une largeur égale à la largeur de l'écran, ajoutez la fonction suivante:
La disposition de la grille ressemblera maintenant à (j'ai également ajouté un fond bleu à la première cellule):
la source
Pour Swift 3 et XCode 8 , cela a fonctionné. Suivez les étapes ci-dessous pour y parvenir: -
Placez ce code dans la fonction viewDidLoad ().
la source
Dans certaines situations, la définition de
UICollectionViewFlowLayout
inviewDidLoad
ouViewWillAppear
peut ne pas affecter la collectionView.La définition de
UICollectionViewFlowLayout
inviewDidAppear
peut entraîner des modifications de la taille des cellules lors de l'exécution.Une autre solution, dans Swift 3:
la source
Si vous recherchez Swift 3, suivez les étapes pour y parvenir:
Ceci est vérifié sur Xcode 8.0 avec Swift 3.
la source
la source
Swift 4
la source
Pour Swift 3 et XCode 8, cela a fonctionné. Suivez les étapes ci-dessous pour y parvenir: -
la source
Pour Swift 3+ et Xcode 9+ Essayez d'utiliser ceci
la source
Swift 5: pour des espaces uniformément répartis entre les cellules avec une largeur de cellule dynamique afin de tirer le meilleur parti de l'espace du conteneur, vous pouvez utiliser l'extrait de code ci-dessous en fournissant une valeur minimumCellWidth .
la source