使用SnapKit约束label、scrollview和tableview

Snapkit:https://github.com/SnapKit/SnapKit

一、约束UILabel

这个其实本来是很简单的,被自己搞的复杂了,当设置UILabel的时候frame:CGRect.zero就可以了,另外行数设置为:0,一定一定不要设置固定高度 /(ㄒoㄒ)/~~,frame里不要,约束里也不要,可以设置大于等于。

let lb = UILabel(frame: CGRect.zero)
lb.font = UIFont.systemFont(ofSize: 15)
// 设置为0, 才可以自动换行
lb.numberOfLines = 0
lb.text = "这本应该是iOS中一个标准、内置的解决空table和collection view的方式。认的如果你的table view是空的,屏幕就是空的。但这不是你能提供的最好的用户体验。\n 用了这个库,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示用户信息。很明显,每个iOS项目都应该采用。\n在使用第三方类库时,使用cocoaPods是非常方便的,具体使用方法可以参考:CocoaPods安装和使用教程 的安装使用方法。今天讨论的问题是,我在使用的时候遇到了一些问题"
superView.addSubview(lb)
// 一定要在加到父view后才可以用   
lb.snp.makeConstraints { (make) in
    make.top.equalToSuperview().offset(8)
    make.left.equalToSuperview().offset(8)
    make.right.equalToSuperview().offset(-8)
}

二、约束UIScrollView

由于UIScrollView比较特别,真正的高度是contentSize.height,其中的元素不能直接对UIScrollView约束。

解决方法是,在其中加一个viewContainer (UIView),让scrollview的contentSize.height自适应viewContainer,而viewContainer的高度自适应与其中的各个控件。

重点内容都在代码里:

import UIKit
import SnapKit

class rootViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.gray
        self.title = "自动布局"

        // 如果使用了UINavigationController,scroll的上方会出现一片空白区域。设为false可以取消
        // 只有当scroll为第一个控件的时候会出现
        self.automaticallyAdjustsScrollViewInsets = false


        let sc = UIScrollView(frame: CGRect.zero)
        self.view.addSubview(sc)

        sc.backgroundColor = UIColor.white
        sc.snp.makeConstraints { (make) in
            make.top.equalToSuperview().offset(120)
            make.left.equalToSuperview().offset(15)
            make.right.equalToSuperview().offset(-15)
            make.bottom.equalToSuperview().offset(-15)
        }

        let viewContainer = UIView(frame:CGRect.zero)
        sc.addSubview(viewContainer)

        viewContainer.backgroundColor = UIColor.green

        viewContainer.snp.makeConstraints { (make) in
            make.edges.width.equalTo(sc)
            make.top.equalTo(sc)
            // 这个很重要!!!!!!
            // 必须要比scroll的高度大一,这样才能在scroll没有填充满的时候,保持可以拖动
            make.height.greaterThanorEqualTo(sc).offset(1)
        }

        let lb = UILabel(frame: CGRect.zero)
        lb.font = UIFont.systemFont(ofSize: 15)
        lb.numberOfLines = 0
        lb.textColor = UIColor.black
        lb.text = "这本应该是iOS中一个标准、内置的解决空table和collection view的方式。认的如果你的table view是空的,屏幕就是空的。但这不是你能提供的最好的用户体验。\n 用了这个库,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示用户信息。很明显,每个iOS项目都应该采用。\n在使用第三方类库时,我在使用的时候遇到了一些问题"
        viewContainer.addSubview(lb)

        lb.snp.makeConstraints { (make) in
            make.top.equalToSuperview().offset(8)
            make.left.equalToSuperview().offset(8)
            make.right.equalToSuperview().offset(-8)
        }

        let btn1 = UIButton(type: UIButtonType.system)
        btn1.setTitle("显示更多",for: .normal)
        btn1.frame = CGRect.zero
        btn1.backgroundColor = UIColor.purple
        btn1.setTitleColor(UIColor.white,for: .normal)

        viewContainer.addSubview(btn1)

        btn1.snp.makeConstraints { (make) in
            make.top.equalTo(lb.snp.bottom).offset(5)
            make.width.equalTo(100)
            make.height.equalTo(30)
            // 这个很重要,viewContainer中的最后一个控件一定要约束到bottom,并且要小于等于viewContainer的bottom
            // 否则的话,上面的控件会被强制拉伸变形
            // 最后的-15是边距,这个可以随意设置
            make.bottom.lessthanorEqualTo(viewContainer).offset(-15)
            make.centerX.equalToSuperview()
        }
    }

    func btnClick(sender:UIButton) {
        let detail = DetailViewController()
        self.navigationController?.pushViewController(detail,animated: true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

三、约束UITableViewCell

基于上面的方法,这个就比较简单了,以前苦逼的计算每个cell的高度/(ㄒoㄒ)/~~

在这里可以直接把Cell当做上面的viewContainer就好了。重点是UITableView的属性设置:

tv = UITableView(frame: .zero,style: .plain)
// 可以自适应高度的重点就是这个
tv.estimatedRowHeight = 44
// 固定行高,我没看出这个的实际效果,谁能告知一下。。。\(^o^)/~
tv.rowHeight = UITableViewAutomaticDimension
self.view.addSubview(tv)
tv.snp.makeConstraints { (make) in
    make.left.right.bottom.equalTo(self.view)
    make.top.equalTo(self.view).offset(60)
}

内容大概就这么多吧,别急着赶路,把路填平了,才能跑起来。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...