【问题标题】:UIScrollView contentOffset value marginally wrongUIScrollView contentOffset 值略有错误
【发布时间】:2021-12-08 22:14:35
【问题描述】:

我的ViewController 中有一个scrollViewscrollView 垂直居中放置,其宽度等于ViewController 的宽度,高度等于100。为了使scrollView 可滚动,我为这个scrollView 设置了一个任意contentSize,假设它是(500, 100)。这有助于我的 scrollView 水平滚动。

我的要求是我希望scrollView 的内容从scrollView 的水平中心开始。因此,我在上面设置了contentInset 值。

let halfWidth = scrollView.bounds.size.width / 2.0
scrollView.contentInset = UIEdgeInsets(top: 0, left: halfWidth, bottom: 0, right: halfWidth)
scrollView.contentOffset = CGPoint(x: -halfWidth, y: 0)

记住,我的scrollView 宽度等于ViewController 宽度。因此,上述代码中的halfWidth 值将与view.bounds.width / 2.0 相同。

在哪里工作

在 iPhone 12 Pro 中,数据值如下所示:

  • ViewController / 屏幕 / scrollView 宽度 = 390
  • halfWidth = 195
  • scrollView.contentOffset.x = -195

根据我们在代码中的计算,上述所有值都是绝对正确的。

哪里不行

在 iPhone 12 mini 中,数据值如下所示:

  • ViewController / 屏幕 / scrollView 宽度 = 375
  • halfWidth = 187.5
  • scrollView.contentOffset.x = -187.33333333333334

scrollView.contentOffset.x 的值本来应该是-187.5,但实际上是-187.33333333333334

使用所有其他设备进一步观察

通过观察模式,我意识到 contentOffset 值中的这种边际错误出现在满足以下两个条件的特定设备上:

  • 条件一:设备宽度为奇数。
  • 条件 2:设备比例因子为奇数。

重现错误的示例设备 - iPhone 12 mini、11 Pro、X、XS。所有这些设备的屏幕宽度375 和比例因子3

为什么精度很重要

我的用例是我正在使用UICollectionView 创建一个自定义滑块,它负责根据已经发生的滚动量发出滑动的值/分数。在我上面提到的问题细节中,该场景是针对没有发生滚动的情况,因此我对发出的值/分数的期望是0。但是,由于这个边际错误,每次用户尝试将其滚动到开头时,该值都会变为非零。

这是一个已知的错误吗?有什么解决办法吗?

我创建了一个用于快速调试的示例项目。 You can clone it from here.

【问题讨论】:

    标签: ios uicollectionview uiscrollview uikit


    【解决方案1】:

    操作系统会将您的控件放置在偶数像素边界上。

    您正在将控件定位在 UI 空间中。因此系统会将您提供的坐标转换到像素空间,设置控件的位置(在像素边界上),但在 UI 空间中将位置返回给您。

    所以它会在 UI 空间中获取您的偏移量并将其转换为像素空间:

    偏移 * 画面比例 = 像素偏移

    187.5 * 3 = 562.5 像素

    但像素是真实的物理事物。没有半像素之类的东西。所以系统四舍五入,像素偏移变为562像素。

    当您将该偏移量转换回 UI 空间时

    像素偏移/屏幕比例=ui空间偏移

    562 / 3 = 187.3333...

    这就是系统将这个价值返还给你的原因。

    【讨论】:

    • 这使我的理解更加清晰。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多