UICollectionViewFlowLayout minimumInteritemSpacing错误?

时间:2013-01-30 13:23:45

标签: ios uicollectionviewlayout

经过多次摆弄后,我开始怀疑UICollectionViewFlowLayout的间距代码中存在错误。

问题很简单:我想在屏幕上显示五个按钮,我希望按钮之间的间距为1 pt(视网膜显示屏上有2个像素)。为了达到这个目的,我将minimumInteritemSpacing设置为1.0,将单元格宽度设置为159.5 pt,这样两个单元格将加起来达到319 pt,从而为该空间留下一个点。当我希望第三个按钮是视图的整个宽度时出现问题,因为流程布局导致间距为0.5 pt,尽管已被告知保持最小值为1.0。 (见截图1)

right layout wrong spacing

设置间距的代码发生在

-(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)

right spacing wrong layout

应该注意的是,在故事板中设置了CollectionView,CollectionViewCell和UILabel,并且我已经确保屏幕截图中可见的标签框架小于单元格的宽度,我也尝试删除完全标签,但结果相同。

我不明白为什么会发生这种情况,除非它是流程布局代码中的错误,我在此之前正在寻找一个完整性检查,然后再将其作为错误提交。

2 个答案:

答案 0 :(得分:4)

正如评论中所提到的,必须在这里描述问题和一些后续思想的组合使我意识到尽管minimumInteritemSpacing是一个CGFloat,但是当你传递它的小数值及其行为是没有意义的这样做是不确定的。这是因为,在像素比为1:1的设备上,没有半像素这样的东西。事实恰恰相反,在某些情况下,它表现得像我预期的那样,从而使我对真正的(而且相当明显的)问题视而不见。

希望阅读本文可以帮助其他人快速意识到错误。

答案 1 :(得分:0)

解决方案是将点值除以屏幕比例。

flowLayout.setMinimumInteritemSpacing = 1.0 / UIScreen.main.scale

该属性采用points中的值,这是屏幕像素的抽象。来自Apple文档:

  

对于Retina显示器,比例因子可以是3.0或2.0和一个点   可以分别用九个或四个像素表示。对于   标准分辨率显示,比例因子是1.0和一个点   等于一个像素。

通过将点值除以屏幕比例,您可以在设备屏幕上获得等于1像素的CGFloat值。