【问题标题】:UICollectionViewFlowLayout minimumInteritemSpacing bug?UICollectionViewFlowLayout minimumInteritemSpacing 错误?
【发布时间】:2013-01-30 13:23:45
【问题描述】:

经过一番折腾,我开始怀疑 UICollectionViewFlowLayout 的间距代码中存在错误。

问题很简单:我想在屏幕上显示五个按钮,我希望按钮之间的间距为 1 pt(视网膜显示屏上为 2 像素)。为了实现这一点,我将 minimumInteritemSpacing 设置为 1.0,将单元格宽度设置为 159.5 pt,这样两个单元格的总和将达到 319 pt,从而为空间留下一个点。当我希望第三个按钮成为视图的全宽时出现问题,因为流布局导致间距为 0.5 pt,尽管已被告知保持最小值为 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 是在情节提要中设置的,并且我已经确保截图中可见标签的框架小于单元格的宽度,我也尝试删除完全标记,但结果相同。

我不明白为什么会发生这种情况,除非它是流布局代码中的错误,并且我在将其作为错误提交之前在这里寻找健全性检查。

【问题讨论】:

  • 有时不得不问这个问题可以澄清你自己的问题。令我震惊的是,您可能无法使用小数点大小,并且它在视网膜显示器上工作的原因是“幸运”的侥幸。进一步的研究正在进行中......
  • 当然,在 320 点实际上是 320 像素 195.5 的非视网膜设备上没有任何意义,要么必须是天花板,要么是地板,导致没有间隙或两个像素的间隙。看来我已经回答了我自己的问题。感谢收听。

标签: ios uicollectionviewlayout


【解决方案1】:

正如 cmets 中所提到的,必须在此处描述问题以及随后的一些想法使我意识到,尽管 minimumInteritemSpacing 是 CGFloat,但在您传递小数值及其行为时没有意义这样做是未定义的。这是因为,在点与像素比率为 1:1 的设备上,没有半个像素这样的东西。碰巧在某些情况下,它的行为符合我的预期,从而使我对真正的(而且相当明显的)问题视而不见。

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

【讨论】:

  • 这是一个非常有用的提示,今天为我节省了一些时间。谢谢!
  • 如果您将小数值传递给minimumInteritemSpacing,则行为不是未定义的。看我的回答。
【解决方案2】:

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

flowLayout.setMinimumInteritemSpacing = 1.0 / UIScreen.main.scale

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2021-03-01
    • 1970-01-01
    • 2014-09-24
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多