UICollectionView 3 列网格,1px space?? (包括图像)

UICollectionView 3 column grid, 1px space?? (image included)

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

我一切正常,但在第 2 列和第 3 列之间有一个奇怪的 1px space,我不知道为什么!?我已经验证了 iOS 模拟器和真实设备上都出现了 1px 的差距。有人经历过吗?

我的 UIViewController 是以下的 delegate/datasource:

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

我已经实现了删除任何间距的必要功能(并通过打印语句验证它们是 运行),以及对彼此相邻排列的单元格进行视觉确认:

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
}

最后,我打印出要返回的单元格的宽度(每个颜色方块)以验证它是 (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)
}

并在 class 的开头定义以下变量:

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

例如,您的屏幕宽度 = 320,当您将它除以 3 时,您得到 106.6666。如果将其视为 Int,我们有:106 * 3 = 318。我们需要将 2 个像素按 1 px 添加到前两个单元格,因为 320 - 318 = 2。请尝试下面的解决方案。

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let columns = 3 
    let width = Int(UIScreen.main.bounds.width)
    let side = width / columns
    let rem = width % columns
    let addOne = indexPath.row % columns < rem
    let ceilWidth = addOne ? side + 1 : side
    return CGSize(width: ceilWidth, height: side)
}