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

在iOS开发中,ScrollView滚动失效通常是由于scrollEnabled、userInteractionEnabled设置不当或ContentSize计算错误引起。本文深入分析了由于自动布局约束导致的ContentSize赋值不成功问题,指出当ScrollView的约束固定了其subview位置时,ContentSize即被确定,后续设置将无效。为解决这个问题,建议采用延迟操作来刷新UIScrollView的contentSize。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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(), ^{
    [self.scrollView setContentSize:CGSizeMake(kScreen_Width, 1000)];
    });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值