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