首先我们先来了解一下什么是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。
看一下效果:
在使用的地方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自适应:
先看效果:
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 的协议方法。
网友评论