在 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 已适当设置)。滚动,等待一会儿,然后再次滚动完美。