ios - UIScrollView 的 contentOffset 在添加小数字时被截断

标签 ios swift uitableview uiscrollview swift2

我有带有 Storyboard的 swift 2.0 ios 应用程序。我有一个 tableViewController 并且在每一行中我都有 scrollView(禁用用户滚动)。在这个 scrollView 中,我有一个图像,它适合滚动的大小,而且有点高。问题是当 tableView 滚动时,我想在此图像上实现“ float ”效果。 这是一个代码:

    override func scrollViewDidScroll(scrollView: UIScrollView) {
        let cells = tableView.visibleCells

        let offsetY = scrollView.contentOffset.y

        var diff:CGFloat = (offsetY - lastY) / 10

        for cell in cells {
            let indexPath = tableView.indexPathForCell(cell)!

            let scroll = cell.viewWithTag(102) as! UIScrollView
            let oldY = scroll.contentOffset.y
            let newY = oldY + diff
            let height = scroll.contentSize.height
            if(newY >= 0 && newY + cellHeight < height){
                scroll.contentOffset = CGPointMake(scroll.contentOffset.x, newY)
            }

            if(indexPath.row == 0){
                print("\(oldY) + \(diff) = \(newY)")
            }
        }

        lastY = offsetY
    }

我在这里做的是计算 tableView 滚动位置的差异(变量“diff”),获取所有可见单元格并根据该差异滚动 scrollView(除以 10 并沿相反方向)。当我快速滚动时,它以某种方式工作,但当我滚动得非常慢时,没有任何东西在移动。

当我慢慢滚动时,我得到这样的输出(最后打印):

15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55
15.5 + 0.05 = 15.55

当 diff 太小时,scrollView 会以某种方式截断(或舍入)结果。

当我滚动得更快时:

23.0 + 0.25 = 23.25
23.5 + 0.25 = 23.75
24.0 + 0.15 = 24.15
24.0 + 0.25 = 24.25
24.5 + 0.25 = 24.75
25.0 + 0.25 = 25.25
25.5 + 0.25 = 25.75

在这里你可以看到它正在求和,但有些结果不匹配(第 x 行的总和应该是下一行的第一个数字)。

如简单示例所示,这不是 CGFloat 的问题:

var sum:CGFloat = 0

for(var i = 0; i < 10; i++){
   let number:CGFloat = 0.05
   sum += number
   print(sum)
}

结果:

0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5

我该如何解决? 也许我应该使用不同的方法来获得类似的效果?

最佳答案

UIScrollView.contentOffset 在视网膜显示器上四舍五入为 0.5(在 iPhone 6+ 上为 0.33)。

我建议创建自定义 UITableViewCell 子类(如果您还没有)并在其中创建自定义变量:

class MyCell: UITableViewCell {
    var unroundedContentOffsetY: CGFloat {
        didSet {
            scroll.contentOffset = CGPoint(x: scroll.contentOffset.x, unroundedContentOffsetY)
        }
    }
}

然后计算 cell.unroundedContentOffsetY 变量而不是 cell.scroll.contentOffset

关于ios - UIScrollView 的 contentOffset 在添加小数字时被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32661023/

相关文章:

ios - 在 CollectionView 中使用 SDWebImage 的疯狂内存问题(在 tableviewCell 内)

arrays - 快速自动刷新单元格

swift - 从dae文件中获取预览图,显示在UIImage中

ios - 如何在 iOS 模拟器中调试 .app 崩溃?

ios - 如何在 objective c xcode 中传递开关的值

iphone - indexOfObject第一次返回0而不是NSNotFound

ios - 为什么我的变量的值在Swift中恢复?

swift - 如何确定 CGFloat 是 Fl​​oat 还是 Double

ios - NSURLConnection 错误代码(-1202,1012)

swift - 将 3D Touch 与 Storyboard的 peek 和 pop 结合使用