我有带故事板的swift 2.0 ios应用程序。我有一个tableViewController,在每一行中都有scrollView(用户滚动被禁用)。在这个scroll视图中,我有一个图像,它适合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”),得到所有可见的单元格,然后滚动滚动视图的差异(除以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
我怎样才能修好它?
也许我应该用不同的方法来获得相似的效果?
最佳答案
设置后,retina显示器上的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/