【发布时间】:2011-10-15 23:11:54
【问题描述】:
在 UIScrollview 中水平滚动时,如果我在同一方向快速滑动两次,滚动视图会剧烈跳跃。有没有办法防止这种情况发生?为了详细解释,这里有一个来自滚动视图的事件日志,在大多数委托方法中,我只打印 x 坐标。
scrollViewWillBeginDragging:
14:55:12.034 Will begin dragging!
14:55:12.037 - Position -0.000000
scrollViewWillBeginDeceleration:
14:55:12.129 Deceleration rate 0.998000
14:55:12.152 + Position 314.000000
scrollViewWillBeginDragging:
14:55:12.500 Will begin dragging!
14:55:12.522 - Position 1211.000000
scrollViewWillBeginDeceleration:
14:55:12.530 Deceleration rate 0.998000
14:55:12.533 + Position 1389.000000
scrollViewDidScroll: (printing values < 0 && > 6000 (bounds.size.width)
14:55:12.595 !!! Position 7819.000000
14:55:12.628 !!! Position 9643.000000
14:55:12.658 !!! Position 10213.000000
14:55:12.688 !!! Position 10121.000000
14:55:12.716 !!! Position 9930.000000
... contentoffset.x drops with around 400 each scrollviewdidscroll call ...
14:55:13.049 !!! Position 6508.000000
scrollViewDidEndDecelerating:
14:55:13.753 Will end deceleration
14:55:13.761 * Position 6144.000000
日志中最值得注意的是在 scrollViewWillBeginDeceleration 之后 contentoffset.x 在几毫秒内以约 6000 点跳跃。
实施
uiscrollview 和 uiscrollviewdelegate 属于同一个类,是 uiscrollview 的子类,也实现了 uiscrollviewdelegate 协议,contentoffset 没有什么特别的,只在scrollview 上设置的属性有:
self.showsHorizontalScrollIndicator = YES;
self.scrollsToTop = NO;
self.delegate = self;
滚动视图子视图是通过在承载 uiscrollview 的 uiviewcontroller 中的 viewwillappear 调用添加一次(并且 contentSize 已适当设置)。滚动,稍等片刻,然后再次滚动完美。
【问题讨论】:
-
似乎根本原因是背景颜色与 [UIColor colorWithPattern:...] 在绘制时产生了轻微的延迟,滚动视图中的子视图都没有被移动或绘制,但是 contentOffset.x还是增加了。当滚动视图终于开始移动时,contentOffset.x 急剧增加,甚至远远超出了内容的范围,导致视图以一种可怕的方式跳转到该偏移量。通过使用较轻(或无背景),我能够获得更流畅的滚动。
-
如果您将背景放在滚动视图后面的另一个视图中并将滚动视图的背景颜色设置为透明怎么办?
-
您是否使用任何自定义加速度方程直接更新滚动视图的偏移值来执行滚动动画?
标签: objective-c ios uiscrollview uiscrollviewdelegate