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

时间:2015-04-04 00:45:13

标签: ios swift uicollectionview uicollectionviewcell

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

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

我的UIViewController是以下代理/数据源:

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

enter image description here

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

我遇到了同样的问题,我用以下代码修复了它:

 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)

答案 2 :(得分: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);

答案 3 :(得分:0)

例如,您的屏幕宽度= 320,将其除以3则得到106.6666。如果将其视为Int,则有:106 * 3 =318。由于320-318 = 2,我们需要将2个像素乘以1 px加到前两个单元格中。

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