问题演示
如下图所示
ScrollView初始content的高度为800,改为1000,然后滚动到最底部,再改为800,然后点击一次ScrollView,便会触发一次不该有的向上的自动滚动。
两个版本demo
ScrollView-Bug2.4.8.zip (811.7 KB)
ScrollView-Bug3.5.0.zip (1.6 MB)
导致问题的原因
看了ScrollView的源码后发现了以下几点。
- 超出边界的差值会记录在_outOfBoundaryAmount里,但是这个_outOfBoundaryAmount不是每次检测边界时都更新的,它需要_outOfBoundaryAmountDirty为true才会更新
- 在content size改变的时候,ScrollView会检测content有没有超出边界,此时会更新_outOfBoundaryAmount并直接修改content坐标。但是修改完content坐标之后_outOfBoundaryAmount记录的仍旧是旧值,此时_outOfBoundaryAmountDirty为false。
- ScrollView在touchend的时候会触发检测当前有没有超出边界,有的话自动回弹滚动。由于_outOfBoundaryAmountDirty为false,所以并未更新_outOfBoundaryAmount,而是直接取错误的_outOfBoundaryAmount作为超出边界的值,然后进行错误的自动回弹。
最后
因为在项目中需要去实时修改content的size,所以遇到了这个问题。
我对此问题的解决方案是监听content的坐标改变,然后设置_outOfBoundaryAmountDirty为true,这样就能及时更新_outOfBoundaryAmount了。
1 个帖 - 1 位参与者