我发现了一些关于UITableViews / UIScrollViews在你举起手指后在Objective-C for iOS中滚动的“奇怪”的事情:
滚动视图的“速度”(如scrollViewWillEndDragging:withVelocity:targetContentOffset:
中所示)不是基于时间而是基于“渲染”或“帧刷新”等;即,“速度”3.0意味着滚动视图将在下一次刷新之前滚动3.0点,此时如果“速度”仍为3.0,它将滚动另外3.0点。 (与基于时间的绝对速度相反)
“刷新”大约发生。每秒950次,但这种情况各不相同,并且不可靠。 (再次,与基于时间的绝对刷新率相反)
因为UIScrollViews以指数方式而不是线性方式减速,decelerationRate
是一个几何常数。这意味着在滚动视图的每次“刷新”时,其“速度”被设置为其先前的速度乘以“减速率”。
在某些时候,滚动视图的速度足够接近零,它停止滚动。我不确定这个门槛是什么。
我已经推导出一个理论上可以求解的方程来调整减速率,以便滚动视图可以自然地用动量滚动并且足够靠近表格视图单元的顶部以模仿“分页”。 (我还添加了动画scrollViewDidEndDragging:willDecelerate:
以最小化调整内容偏移量。调整内容偏移量无调整减速率看起来很奇怪;滚动视图要么向前跳跃要么突然向后倾斜。)
此等式为: A d ^ n + B d + C = 0 其中d = decelerationRate
。理想情况下,我喜欢 d(n,A,B,C)形式的东西,但我的数学博士朋友告诉我,这不是确定性的可能。他向我指出了以下页面:http://en.wikipedia.org/wiki/Root-finding_algorithm
我还发现我无法使用动画样式UIViewAnimationCurveEaseOut
将滚动视图设置为预设内容偏移的动画,因为setContentOffset:animated:
不会使用options:
参数。否则我会“假装”滚动到我的预先计算的内容偏移量。
(我在SO上发现了这个,但它对我不起作用:UIScrollview setContentOffset with non linear animation ?)
我想使用表格视图,因为滚动视图中的所有元素本质上都是单元格,表格视图最适合显示单元格列表。然而,基于我难以获得我想要的行为,我可能只是制作一个分页滚动视图,这可能会更容易。然后我可以限制在我的自定义“表视图”中可见的“单元格”的数量,或者根据需要在事后加载它们。
到目前为止,我还没有找到我想要的现有例子。
或
答案 0 :(得分:4)
所以这个答案是通过#iphonedev IRC频道的一个狡猾而精彩的用户获得的!
从scrollViewWillEndDragging:withVelocity:targetContentOffset:
开始,您可以通过*targetContentOffset = newTargetOffset;
将targetContentOffset重新设置为您想要的任何内容!令人难以置信的简单和优雅。
我的错误是试图从[scrollview setContentOffset:newTargetOffset animated:YES]
内拨打scrollViewWillEndDragging:withVelocity:targetContentOffset:
,这根本不起作用,因此我开始以更复杂的方式“解决”我的问题。完全没用。