UICollectionView 3 grid de colonnes, 1px espace ?? (image incluse)

J'ai installé un UICollectionView avec un FlowLayout qui ne laisse aucun espace entre les cellules dans les directions verticales ou horizontales.

J'ai tout fonctionné, pourtant il y a un espace impair de 1px entre les 2ème et 3ème colonnes et je n'ai aucune idée pourquoi!? J'ai vérifié l'écart 1px apparaît à la fois dans le simulateur iOS et sur un appareil réel. Quelqu'un a-t-il vécu cela?

Mon UIViewController est un délégué / datasource des éléments suivants:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

J'ai implémenté les fonctions nécessaires pour supprimer tout espacement (et vérifié avec les instructions d'printing qu'ils fonctionnent), ainsi que la confirmation visuelle des cellules alignées les unes à côté des autres:

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsetsZero } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { return 0 } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { return 0 } 

Enfin, j'ai imprimé la largeur de la cellule returnnée (chaque carré de couleur) pour vérifier que c'était le (view.frame.width / 3) ou (320/3) , qui est 106.666667

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { var totalHeight: CGFloat = (self.view.frame.width / 3) var totalWidth: CGFloat = (self.view.frame.width / 3) println(totalWidth) // this prints 106.666666667 return CGSizeMake(totalWidth, totalHeight) } 

entrez la description de l'image ici

Mieux vaut éviter le double type du numéro dans des situations similaires. Utilisation:

 return CGSizeMake(ceil(totalWidth), ceil(totalHeight)) 

J'avais le même problème, je l'ai corrigé avec le code ci-dessous:

  func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let paddingSpace = sectionInsets.left * 4 let availableWidth = view.frame.width - paddingspace let widthPerItem = availableWidth/3 return CGSizeMake(width: widthPerItem, height: widthPerItem) } 

et définissez la variable ci-dessous au début de votre class:

 fileprivate let sectionInsets = UIEdgeInsets(top: 0.0, left: 0.5, bottom: 0.0, right: 0.0) 

Voici ma solution pour émettre juste la cellule du milieu de la largeur 106 et deux autres avec la largeur 107 dans la collection de la méthode

 NSInteger numColumns = 3; CGSize deviceSize; CGFloat width = self.view.frame.size.width / numColumns; CGFloat height = width ; NSInteger rem = (int)self.view.frame.size.width%numColumns; if(indexPath.row == (1 + numColumns*counter) && rem != 0) { deviceSize = CGSizeMake(floor (width), ceil(height)); counter++; } else { deviceSize = CGSizeMake(ceil (width), ceil(height)); } deviceSize = CGSizeMake(deviceSize.width, deviceSize.height);