UIScrollView是大家常用的一个控件,今天看看UIScrollView与SnapKit的简单使用
首先要理解一点核心思想:UIScrollView是依靠与其子视图(subview)之间的约束来确定ContentSize的大小。为什么这么说呢?
这是因为UIScrollView是个非常特殊的UIView, 对于UIScrollView的subview来说,它的leading/trailing/top/bottom的space是相对于UIScrollView的contentSize而不是bounds来确定的,换句话说:UIScrollView与其subview之间相对位置的约束并不会直接用于frame的计算,而是会转化为对ContentSize的计算。当UIScrollView知道了上下左右的约束分别指向subview的什么位置之后,只要subview的位置固定下来了,那么UIScrollView的ContentSize的大小就确定下来了。
但是当我们尝试使用UIScrollView和它subview的leading/trailing/top/bottom来互相决定大小的时候,会出现Has ambiguous scrollable content width/height」的 warning。所以我们习惯的做法是在UIScrollView和它原来的subviews之间增加一个contentView,依靠contentView来确定contentSize。
注意几点:
1)如果我们需要竖向的滑动效果,就把width设为和scrollview相同,如果需要横向的滑动 就把height设为和scrollview相同
2)使用了SnapKit或者说AutoLayout,那么就不需要设置UIScrollView的ContentSize了,系统会根据constraints自己来确定ContentSize的大小
import UIKit
import SnapKit
class ViewController: UIViewController {
let scrollView = UIScrollView()
let contentView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
view.addSubview(scrollView)
scrollView.snp.makeConstraints { (make) in
make.edges.equalTo(view)
}
// 添加容器视图
scrollView.addSubview(contentView)
contentView.snp.makeConstraints { (make) in
make.top.bottom.equalTo(scrollView)
make.left.right.equalTo(view) // 确定的宽度,因为垂直滚动
}
let label1 = UILabel()
contentView.addSubview(label1)
label1.numberOfLines = 0
label1.backgroundColor = UIColor.yellow
label1.snp.makeConstraints { (make) in
make.left.right.equalTo(contentView).inset(20)
make.top.equalTo(contentView).offset(20)
}
let label2 = UILabel()
contentView.addSubview(label2)
label2.numberOfLines = 0
label2.backgroundColor = UIColor.red
label2.snp.makeConstraints { (make) in
make.left.right.equalTo(label1)
make.top.equalTo(label1.snp.bottom).offset(20)
make.bottom.equalToSuperview() // 底部一定要,不然不能够确定contentSize。
}
label1.text = "年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可"
label2.text = "致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可年注册即可afhjvajvbjjzxbzjcbjznckjnckjnalfnvzjnv今年福建男子在看 v 你在今年初v 和 iv 分 奥斯 v 和 i 导致 v 㷣 v 后ID v 家 啊㷣 vi 后ID v 家 简单南昌召开农村做课间操你自己看自己看 v 你做课间操政策加快农村政策框架女装穿几年注册即可"
}
}
效果图如下: