当UIScrollView遇上SnapKit

来源:互联网 发布:exe打包软件 编辑:程序博客网 时间:2024/06/05 03:59

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的大小


下面看一个简单的例子,一个UIScrollView上添加两个UILabel

import UIKitimport SnapKitclass 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 你做课间操政策加快农村政策框架女装穿几年注册即可"    }}


效果图如下:





原创粉丝点击