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