【问题标题】:UICollectionView 3 column grid, 1px space?? (image included)UICollectionView 3 列网格,1px 空间? (包括图片)
【发布时间】:2015-04-04 00:45:13
【问题描述】:

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

我一切正常,但第 2 列和第 3 列之间有一个奇怪的 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)
}

【问题讨论】:

  • 您是否找到了比以下解决方案更好的解决方案?
  • @BlueBoy 我没有。我采用的解决方案是将其中两列设为(宽度/3)的天花板或地板,然后将第三列设置为余数。
  • 如何将其中的两列设为 ceil?

标签: ios swift uicollectionview uicollectionviewcell


【解决方案1】:

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

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

【讨论】:

  • 但我不希望单元格的大小(宽度和高度)是浮动的吗?当我实现此代码时,每行只显示 2 个单元格,因为 107+107+107 = 321,即 > 320 的视图宽度。
  • 至少,你可以做107+107+(320-214)
  • 你是对的 - 这行得通......但是既然 CGSizeMake 将 CGFloats 作为输入参数,为什么这很重要?
  • 任何情况下都需要很长的数字,具体情况如何使用数字是你的选择。
  • @rose,你需要确定UICollectionView的渲染逻辑。不要忘记它是自适应的。
【解决方案2】:

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

 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)

【讨论】:

    【解决方案3】:

    例如,您的屏幕宽度 = 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)
    }
    

    【讨论】:

    • 我已经尝试了几个小时来解决类似的问题,这是唯一有效的解决方案。谢谢!
    【解决方案4】:

    这是我的解决方案,只需在方法 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多