关于ScrollView的bug,从v2.4.8-v3.5.0都存在,附demo

问题演示

如下图所示
ScrollView初始content的高度为800,改为1000,然后滚动到最底部,再改为800,然后点击一次ScrollView,便会触发一次不该有的向上的自动滚动。

两个版本demo

ScrollView-Bug2.4.8.zip (811.7 KB)
ScrollView-Bug3.5.0.zip (1.6 MB)

导致问题的原因

看了ScrollView的源码后发现了以下几点。

  1. 超出边界的差值会记录在_outOfBoundaryAmount里,但是这个_outOfBoundaryAmount不是每次检测边界时都更新的,它需要_outOfBoundaryAmountDirty为true才会更新
  2. 在content size改变的时候,ScrollView会检测content有没有超出边界,此时会更新_outOfBoundaryAmount并直接修改content坐标。但是修改完content坐标之后_outOfBoundaryAmount记录的仍旧是旧值,此时_outOfBoundaryAmountDirty为false。
  3. ScrollView在touchend的时候会触发检测当前有没有超出边界,有的话自动回弹滚动。由于_outOfBoundaryAmountDirty为false,所以并未更新_outOfBoundaryAmount,而是直接取错误的_outOfBoundaryAmount作为超出边界的值,然后进行错误的自动回弹。

最后

因为在项目中需要去实时修改content的size,所以遇到了这个问题。
我对此问题的解决方案是监听content的坐标改变,然后设置_outOfBoundaryAmountDirty为true,这样就能及时更新_outOfBoundaryAmount了。

3赞

自从用过一次这个组件 后,我摇摇手跟这个组件say bye

那你现在用哪个?

自己写的scrollview,官方的不好用,,用的人都不多

希望官方的人能看一下这个问题。

https://github.com/cocos/cocos-engine/issues/10947
感谢反馈,内部已建议issue跟进。