【发布时间】:2021-12-08 22:14:35
【问题描述】:
我的ViewController 中有一个scrollView。 scrollView 垂直居中放置,其宽度等于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