Ios UICollectionView 3柱网轴线,1px空间??(包括图片)

Ios UICollectionView 3柱网轴线,1px空间??(包括图片),ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我已经设置了一个UICollectionView,它的FlowLayout在垂直或水平方向的单元格之间都没有空间 我所有的东西都在工作,但是在第二列和第三列之间有一个奇怪的1px空间,我不知道为什么!?我已经在iOS模拟器和真实设备上验证了1px差距。有人经历过吗 My UIViewController是以下内容的委托/数据源: 类MyViewController:UIViewController、UICollectionViewDelegate、UICollectionViewDataSour

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

我所有的东西都在工作,但是在第二列和第三列之间有一个奇怪的1px空间,我不知道为什么!?我已经在iOS模拟器和真实设备上验证了1px差距。有人经历过吗

My UIViewController是以下内容的委托/数据源:

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

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


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

 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)

这是我的解决方案,在MethodCollectionView布局中,只制作中间单元格,宽度为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像素到前两个单元格,因为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)
}
public func collectionView(collectionView:UICollectionView,布局collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:indexPath)->CGSize{
设列=3
let width=Int(UIScreen.main.bounds.width)
let side=宽度/列数
设rem=列的宽度%
让addOne=indexPath.row%列
但是我不希望单元格的大小(宽度和高度)是浮动的吗?当我实现这段代码时,每行只显示2个单元格,因为107+107+107=321,这大于320的视图宽度。至少,您可以使107+107+(320-214)您是对的-这是可行的…但既然CGSizeMake将cgfloat作为输入参数,为什么这会有关系呢?任何情况下都需要很长的数字,在特定情况下如何使用数字是您的选择。@rose,您需要确定在UICollectionView中呈现的逻辑。别忘了它是自适应的。你找到比下面更好的解决方案了吗?@BlueBoy我没有。我采用的解决方案是将其中两列设置为天花板或地板(宽度/3),然后将第三列设置为剩余。如何仅将其中两列设置为天花板?我已经尝试了数小时来解决类似问题,这是唯一有效的解决方案。谢谢
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)
}