我已经设置了一个带有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)
}
答案 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)
}