纠结了许久之后,我开始怀疑UICollectionViewFlowLayout的空格代码中有一个bug。
问题很简单:我有五个按钮想要显示在屏幕上,我希望按钮之间的间距是1pt(在视网膜显示器上是2像素)。为了实现这一点,我将minimumInteritemSpacing设置为1.0,将单元格宽度设置为159.5磅,这样两个单元格的总和将达到319pt,为空间留出一个点。当我想要第三个按钮是视图的全宽时,问题就出现了,因为flow布局导致间距为0.5pt,尽管我被告知要保持最小的1.0。(见屏幕截图1)

设置间距的代码发生在
-(void)viewDidLoad
{
UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)[[self collectionView] collectionViewLayout];
[flowLayout setMinimumInteritemSpacing:1.0];
[flowLayout setMinimumLineSpacing:1.0];
}以及细胞的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 2) {
return CGSizeMake(320 ,151);
}
return CGSizeMake(159.5, 151);
}另一方面,如果我没有使第三个按钮全宽,那么间距就会按预期的方式工作,尽管它不应该影响不同行的项目间间距。(屏幕截图2)

应该注意的是,CollectionView、CollectionViewCell和UILabel都是在故事板中设置的,并且我已经确保截图中可见标签的边框小于单元格的宽度,我也尝试完全删除标签,但效果相同。
我不明白为什么会发生这种情况,除非它是流布局代码中的错误,并且在将其作为错误提交之前,我在这里寻找一个健全的检查。
发布于 2013-02-01 18:55:12
正如评论中提到的,必须在这里描述问题,再加上后来的一些思考,这让我意识到尽管minimumInteritemSpacing是一个CGFloat,但传递给它小数值是没有意义的,而且当你这样做时,它的行为是未定义的。这是因为,在点对像素比率为1:1的设备上,没有半个像素这样的东西。碰巧的是,在某些情况下,它的行为与我的预期不谋而合,从而使我看不到真正的(而且相当明显的)问题。
希望阅读这篇文章能帮助其他人迅速认识到这个错误。
发布于 2017-10-26 18:43:50
解决方案是将点值除以屏幕比例。
flowLayout.setMinimumInteritemSpacing = 1.0 / UIScreen.main.scale
该属性接受points中的值,这是屏幕像素的抽象。来自Apple文档:
对于视网膜显示器,比例因子可以是3.0或2.0,并且一个点可以分别由9个或4个像素表示。对于标准分辨率的显示器,比例因子为1.0,一个点等于一个像素。
通过将点值除以屏幕比例,您得到的CGFloat值等于设备屏幕上的1个像素。
https://stackoverflow.com/questions/14605125
复制相似问题