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

vsikbqxv  于 2023-01-14  发布在  iOS
关注(0)|答案(2)|浏览(155)

我有一个带有故事板的swift 2.0 ios应用程序。我有一个tableViewController,每行都有scrollView(用户滚动被禁用)。在这个scrollView中,我有一个图像,它适合scroll的大小,而且有点高。问题是,当tableView滚动时,我想在这个图像上实现"浮动"效果。下面是一个代码:

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

我该怎么做呢?也许我应该用不同的方法来得到类似的效果?

dbf7pr2w

dbf7pr2w1#

设置时,视网膜显示屏上的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

7kqas0il

7kqas0il2#

显然,用户也可以覆盖定制子类中的contentOffset属性,如下所示:

var unrounded: CGPoint?
override var contentOffset: CGPoint {
    get {
        return unrounded ?? .zero
    }
    set {
        unrounded = newValue
        super.contentOffset = newValue
    }
}

这样做的好处是,它在调用setContentOffset(_:animated:)时也有效,而不仅仅是在赋值给contentOffset时有效。

相关问题