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)];
                                    给scroll-view 设置固定高度 【必须】给scroll-view 样式添加 white-space: nowrap;属性【必须】在scroll-view下的子模块设置 display: inline-block;属性或 display: inline-table【必须】在scroll-view下的子模块设置不得设置 float: left;在scroll-view 上设置属性 scroll-x=”true” 横行滚的许可。
                                    class LibraryViewController: UIViewController, UIScrollViewDelegate
,UICollectionViewDelegate, UICollectionViewDataSource {
	lazy var scrollView: UIScrollView = {
        let scroll = UIScrollView()
                                      今天做了一个ScrollView的小例子(我的环境Xcode5.0.2 IOS7),结果发现无法滚动,即使设置了scrollView的contentSize还是不行,于是研究了一番,最终找到了解决方案:
在ios6之前,因为Xcode没有Autolayout的机制,所以直接使用scrollView,设置它的contentSize即可正常滚动
在ios6之后,因为Xcode引入了Auto...
使用方法前言近期项目原因需要一个上下两屏滑动的效果。可以想象成viewpager左右滑动变成上下滑动。本来想用Srcollview实现,但是由于一些原因,比如按键冲突,和listview布局冲突等等,最后决定自己写一个自定义控件。思路由于之前实现过S
                                    我有一个固定大小scrollview,我试图使问题。我已经阅读了许多类似(但不等于)在StackOverflow和其他网站中的问题,但没有任何答案对我有所帮助,所以我决定问自己的问题。Android:固定大小ScrollView滚动/滚动奇怪基本上,我想要一个固定大小scrollview与不同的控制里面。基本的将是一个textview其中的动态变化的大小。当我更改textview的文本并且它大于...
                                    UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理:
当手指触摸到UIScrollView内容的一瞬间,会产生下面的动作:
拦截触摸事件
tracking属性变为YES
一个内置的计时器开始生效,用来监控在极短的事件间隔内是否发生了手指移动case1:当检测到...