Swift 3.0 使用SnapKit添加约束

作者: 杨老师红烧肉 | 来源:发表于2017-08-08 16:37 被阅读431次

首先我们先来了解一下什么是SnapKit。在2016年的WWDC上苹果官方除了把整个生态系统做了一次全面升级之外,伴随而来还有同期发布的Swift 3.0。以前对Swift2.3心理还存在着疑虑。而现在用了一年Swift3.0之后觉得已经非常的严谨相信以后也不会有大太的版本改动。

为了适应各种屏幕尺寸,iOS 6后引入了自动布局(Auto Layout)的概念,通过使用各种 Constraint(约束)来实现页面自适应弹性布局。在oc时期一直用的是Masonry框架,本身就很优雅的框架积累了大量的粉丝来用这个东西,随着Swift3.0的横空出世和众多开发者的使用,单单的oc混编已经显得过于复杂。应广大开发者要求Masonry的作者推出了支持Swift版本的框架,SnapKit框架!!!SnaoKit是一个轻量级的布局框架,是采用链式语法封装的方式来写Constraints

安装

安装的时候要注意SnapKit的安装环境

   iOS 8.0+ / Mac OS X 10.11+ / tvOS 9.0+

   Xcode 8.0+

   Swift 3.0+

下面我要介绍三种安装SnapKit框架的方法:

一、CocoaPods导入SnapKit

 在Podfile文件中添加:

 platform :ios, ‘8.0’

 use_frameworks!

 target 'MyText1' do

 pod 'SnapKit', '~> 3.2.0'

 end

在这里一定要注意"use_frameworks!"一定要填上,不填上不行!!(我也不知道为什么,知道的告诉我!)。然后pod install就可以了!!
pod install

二,使用Carthage安装SnapKit

 github "SnapKit/SnapKit" ~> 3.2.0

然后在项目的根目录下生成

 Carthage -> Build -> iOS -> SnapKit.framework

最后在把文件集成

 Project -> General -> Embedded Binaries

三,手动导入SnaKit:

首先先将下载下来的SnapKit的SnapKit.xcodeproj放在项目中。

在 工程 -> General -> Embedded Binaries 中点击加号,添加SnapKit。framework库到项目中来

这样就可以了

四,如何使用

我们在工作中一般会遇见两种情况使用到SnapKit,第一种是页面的布局,例如注册,登录了,页面罗列了,会用到。还有一种就是自定制tableViewCell的时候会用到SnapKit。首先我们先来看一下在页面中如何使用SnapKit。

这里我创建了一个名为Myview的uiview使用Snapkit对他添加了距上(top)、距左(left)宽高为100的view。
看一下效果:

view

在使用的地方import SnapKit

import UIKit

import SnapKit

class ViewController: UIViewController {

          override func viewDidLoad() {

               super.viewDidLoad()

               let MyView = UIView()

               MyView.backgroundColor = UIColor.red

               self.view.addSubview(MyView)

               MyView.snp.makeConstraints { (make) in

                        make.top.equalTo(self.view).offset(100)

                        make.left.equalTo(self.view).offset(100)

                        make.width.equalTo(100);

                        make.height.equalTo(100);

               }

           }

    }

让我们在看一下在tableviewcell里面如何使用SnapKit自适应:
先看效果:

cell
  import UIKit
import SnapKit

class OneCell: UITableViewCell {
    
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        selectionStyle = .none
        awakeFromNib()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        
        let icon = UIImageView()
        icon.image = #imageLiteral(resourceName: "icon.png")
        self.addSubview(icon)
        icon.snp.makeConstraints { (make) in
            make.top.equalTo(self).offset(10)
            make.left.equalTo(self).offset(10)
            make.width.equalTo(50)
            make.height.equalTo(50)
        }
        
        let oneLabel = UILabel()
        oneLabel.numberOfLines = 0
        oneLabel.textColor = UIColor.black
        oneLabel.text = "这里一般都是标题"
        self.addSubview(oneLabel)
        oneLabel.snp.makeConstraints { (make) in
            make.top.equalTo(self).offset(20)
            make.left.equalTo(icon.snp.right).offset(15)
            make.width.equalTo(200)
            make.height.equalTo(20)
        }
        
        let rightIcon = UIImageView()
        rightIcon.image = #imageLiteral(resourceName: "icon.png")
        self.addSubview(rightIcon)
        rightIcon.snp.makeConstraints { (make) in
            make.bottom.equalTo(self).offset(-10)
            make.right.equalTo(self).offset(-5)
            make.width.equalTo(20)
            make.height.equalTo(20)
        }
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

左侧的图片是对cell的上、左添加的约束,标题是对左侧图片添加的约束,右侧的小图片是对cell的底,右添加的约束.

cell的高度随着label的高度自适应

屏幕快照 2017-08-08 16.39.01.png

我们先声明一个数组来存储tableview要填充的数据,声明表格tableview集成协议方法把数组里的数据放到cell上

import UIKit
import SnapKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var strarr:[String] = ["某年某月某日在宇宙的某个角落,张根生近一个月第一次走出房间。他的头发蓬松散","张根生一只脚伸到街道的阳光下,而后又缩了回来。一个大妈提着一篮子菜从他身边走过侧脸看了他一下,张根生躲闪着目光企图让自己躲避起来,不要让人注意到他。可是这样做却起到了反效果,每个路过的人","张根生犹豫了再三,鼓起勇气走上街道。他缩着头,大衣把他整个人都掩着严严实实。他的步伐快速。大衣把两边的视野挡住了,他又不敢抬头,只看到行人的腿脚无法十分准确判断他们位置,所以他不可避免地与好几个人相撞了。他恐惧在人群中,仿佛自己就是落入狼群的羊,觉得自己无法呼吸也没法思考,脑子里一直有个声音在呐喊:逃快点,再快点。他的步伐越来越来。撞到人了,他也没有停下来跟人家说"]

    override func viewDidLoad() {
        super.viewDidLoad()
        let tableview = UITableView()
        tableview.frame = CGRect(x: 0, y: 20, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
        tableview.delegate = self
        tableview.dataSource = self
        tableview.estimatedRowHeight = 44.0//添加这句话就不用实现tableview高度协议方法
        self.view.addSubview(tableview)
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return strarr.count;
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = OneCell(style: .default, reuseIdentifier: "OneCell")
        cell.oneLabel.text = strarr[indexPath.row]
        return cell
    }
}

重点是cell里面的label的约束,这个自适应的方法说白了就是根据cell里面的内容来填充cell的高度

import UIKit
import SnapKit

class OneCell: UITableViewCell {
    
    var oneLabel = UILabel()
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        selectionStyle = .none
        awakeFromNib()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        
        oneLabel.numberOfLines = 0
        oneLabel.textColor = UIColor.black
        self.addSubview(oneLabel)
        oneLabel.snp.makeConstraints { (make) in
            make.top.equalTo(self).offset(10)
            make.left.equalTo(self).offset(10)
            make.right.equalTo(self).offset(-10)
            make.bottom.equalTo(self).offset(-10)
        }
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

不要设置label的高度,只设置label距下的距离,使label的内容来填充cell的高度。
最后注意,ViewController里面不用实现tableview height for row 的协议方法。

相关文章

网友评论

    本文标题:Swift 3.0 使用SnapKit添加约束

    本文链接:https://www.haomeiwen.com/subject/weitrxtx.html