当UIScrollView遇上SnapKit

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


效果图如下:





  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值