ScrollView不滚动的原因分析和解决办法

时间:2025-04-02 18:09:35

    iOS搭建界面时经常用到UIScrollView,但是经常遇到ScrollView不能滚动的问题。
    按照一般的解决思路去寻找原因:
1.检测ScrollView的scrollenabled是否为YES;
2.检测ScrollView的userInteractionEnabled是否为YES;
3.检测代码中有没有设置ScrollView的ContentSize,并且比ScrollView的frame要大等等。

    做完一系列的检测发现ScrollView仍然不能滚动。最后断点调试发现ScrollView的ContentSize赋值并不成功,所以导致了ScrollView无法滚动,但是代码中明明写了的,为什么还是赋值不成功呢?

    在进一步观察中发现赋值不成功的原因是因为自动布局中约束的影响。

    主要原因是UIScrollView是个非常特殊的view, UIScrollView与其subview之间相对位置的约束 并不会直接用于frame的计算,而是会转化为对ContentSize的计算

    也就是说当UIScrollView固定了上下左右的约束分别指向subview的位置,只要subview的位置固定下来了,ContentSize的大小就确定下来了。换句话说当设置约束的时候就会默认设置contentSize,并且在后面不管怎么重新设置contentSize的大小,因为是同时进行的,后面系统在运行的时候都会按照之前设置约束时产生的contentSize运行。

     解决办法是:
    其实理解了问题产生的原因就好解决问题了,稍微设置下延迟操作就可以重新设置刷新UIScrollView的contentSize的大小:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [ setContentSize:CGSizeMake(kScreen_Width, 1000)];
    });