前言(本文以swift语言为例)
旧版本ios app开发时,开发者在拿到有scrollview的页面时,因为scrollview的contentSize需要动态计算,大多数都采用纯代码的方式,将scrollview内部子视图的高度累加,算出scrollview的contentSize,当然这样写,好理解,并且纯代码好维护,在页面视图比较所比较碎的话,代码量会相对较多,并且约束的代码也会比较麻烦,维护起来也是有一定难度的。
最近在研究xib的约束,苹果既然提供xib,相比xib有它自己的优势,那我们能不能用xib实现srcollview呢?翻阅了很多文章,终于找到一个可以实现的方法
正文
实现思路:scrollview的frame很好确定,但是contentsize在页面上无法确定,scrollview上加一个大的stackView(不选用UIView的原因,UIView无法根据内容视图,自动撑开),StackView会根据内部视图自动撑开,创建一个ScrollView的分类,在LayoutSubviews的方法中,获取StackView的高度,赋值给scrollview的contentSize。
- 首先创建一个UISCrollView的基类文件,后续xib中的scrollview都继承这个类,在这个类中,重写LayoutSubviews方法,给contentSize赋值
import UIKit
@IBDesignable
class ScrollView: UIScrollView {
override func layoutSubviews() {
if self.subviews.count > 0 {
let height = (self.subviews[0] as UIView).bounds.height
if height != self.contentSize.height {
self.contentSize = CGSize(width: self.bounds.width, height: height)
}
}
}
}
取Scrollview最底层的子视图,也就是我们添加的StackView的总高度,赋值给contentSize
-
xib中添加一个UIScrollView,继承ScrollView,当前scrollview的约束,上下左右边距都为0,和屏幕等宽等高。

-
给scrollView添加一个底视图StackView,添加约束,
如图,stackview宽度固定,所以根据父视图的Frame Layout Guides设置左右边距,高度因为不固定,并且是随着scrollView滚动,下边距无法确定,上边距需要根据父视图的 content Layout Guides设置约束,这点非常重要,如果根据frame设置约束,stackview就会固定在屏幕上,无法滚动。
-
内部视图全部添加在最大的stackview上,内部视图添加后,stackview的高度会自动撑开,运行后可以滚动,亲测可行(下一篇使用StackView心得)