观察
我发现了一些“奇怪”的东西,关于你举起手指后uitableviews/uiscrollviews如何在objective-c for ios中滚动:
滚动视图的“速度”(如scrollViewWillEndDragging:withVelocity:targetContentOffset:
)不是以时间为基础,而是基于“渲染”或“帧刷新”等;即,3的“速度”意味着滚动视图将在下一次刷新之前滚动3点,此时,如果“速度”仍然为3,则它将滚动另外的3点。(与绝对时间为基础的速度相反)
“刷新”大约每秒发生950次,但这是不可靠的。(再次,与基于绝对时间的刷新率相反)
因为uiscrollviews是指数减速而不是线性减速,decelerationRate
是一个几何常数。这意味着在滚动视图的每一个“刷新”中,它的“速度”被设置为其先前的速度乘以“减速率”。
在某个点上,滚动视图的速度接近于零,以至于它停止滚动。我还不确定这个门槛是多少。
期望的行为/问题
我推导了一个可以在理论上解决的方程来调整减速率,使滚动视图可以自然地滚动动量,并且足够靠近表视图单元的顶部以模仿“寻呼”。(我也有一个动画添加到scrollViewDidEndDragging:willDecelerate:
中以最小限度地调整内容偏移量。调整内容偏移量W/O调整减速率看起来很奇怪;滚动视图要么跳到前面,要么突然向后倾斜。
这个方程是:ad^n+bd+c=0,其中d=decelerationRate
。理想情况下,我喜欢d(n,a,b,c)的形式,但我的数学博士朋友告诉我,这是不可能的。他指给我看下一页:http://en.wikipedia.org/wiki/Root-finding_algorithm
我还发现,我不能用动画样式[cc]来激活滚动视图到预定的内容偏移量,因为UIViewAnimationCurveEaseOut
不占用setContentOffset:animated:
参数。否则我会“假”滚动到我预先计算的内容偏移量。
(我在上面找到了这个,但它对我不起作用:UIScrollview setContentOffset with non linear animation ?)
我想使用表视图,因为我的滚动视图中的所有元素基本上都是单元格,表视图最好用于显示单元格列表。但是,基于获取所需行为的困难,我可能只创建一个分页滚动视图,这可能会更容易。然后,我可以限制在自定义“表视图”中可见的“单元格”数量,或者根据需要加载它们。
你有什么想法/想法/建议?
到目前为止,我还没有找到我想要的例子。
插图
或
最佳答案
所以这个答案是通过iphonedev irc频道上一个狡猾但聪明的用户得到的!
在scrollViewWillEndDragging:withVelocity:targetContentOffset:
中,您可以通过*targetContentOffset = newTargetOffset;
将targetcontentoffset重新设置为所需的任何值!难以置信的简单和优雅。
我的错误是试图从[scrollview setContentOffset:newTargetOffset animated:YES]
内部调用scrollViewWillEndDragging:withVelocity:targetContentOffset:
,这根本不起作用,因此我开始以一种更复杂的方式“解决”我的问题,这种方式也根本不起作用。