UICollectionView 3列网格,1px空间?? (包括图片)

我已经设置了一个带有FlowLayout的UICollectionView,它在垂直或水平方向的单元格之间不留空间。

我有一切正常,但第二列和第三列之间有一个奇怪的1px空间,我不知道为什么!? 我已经validation了1xx差距在iOS模拟器和真实设备上都显示出来。 有没有人经历过这个?

我的UIViewController是以下的委托/数据源:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

我已经实现了必要的function来删除任何间距(并通过它们正在运行的打印语句进行validation),以及对彼此相邻排列的单元格的可视化确认:

 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 } 

最后,我打印出要返回的单元格的宽度(每个颜色方块)以validation它是(view.frame.width / 3)还是(320/3) ,即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) } 

在此处输入图像描述

在类似情况下更好地避免数字的双重类型。 使用:

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

我有同样的问题,我用下面的代码修复它:

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

并在类的开头定义下面的变量:

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

这是我的解决方案,在方法collectionView布局中发出宽度为106的中间单元格和宽度为107的其他两个

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