SnapKit

先来谈谈何为 DSL

DSL(Domain Specific Language),即领域特定语言,指的是一种针对特定问题的编程语言,与此相对便是 GPL(General Purpose Language),也就是我们平常所用的编程语言,用途更为宽泛。DSL含有建模所需的特定语法和语义,因此可在与问题域相同的抽象层次高效对概念建模。

A specialized computer language designed for a specific task.

—— Wikipedia

软件开发大师 Martin Fowler 的解读则更加明晰

DSL 通过在表达能力上做的妥协换取在某一领域内的高效。

举个栗子,正则表达式(Regex)SQLHTML & CSS,便是 DSL。

那么,为什么要先讲 DSL,因为 SnapKit 就是针对高效使用 AutoLayout 的 DSL。是的,所以 SnapKit 不仅仅是一个个框架,它是一门编程语言。

安装 SnapKit

使用 CocoapodsCarthage 可以非常方便地进行安装,就不多费篇幅了

  • Cocoapods

    pod 'SnapKit'

  • Carthage

    github "SnapKit/SnapKit"

基本使用

在开篇我们知道了 SnapKit 是一门编程语言,并且是一门专门针对高效使用 AutoLayout 的特定语言,因此它被设计得十分简便易用。

SnapKit-Sample
let containerView = UIView()
superview.addSubview(containerView)containerView.snp.makeConstraints { (make) -> Void inmake.top.equalTo(superview).offset(5)make.left.equalTo(superview).offset(5)make.bottom.equalTo(superview).offset(-5)make.right.equalTo(superview).offset(-5)// 或者可以更简洁// make.edges.equalTo(superview).inset(UIEdgeInsetsMake(5, 5, 5, 5))
}let avatarView = UIView()
containerView.addSubview(avatarView)avatarView.snp.makeConstraints { (make) -> Void inmake.size.equalTo(35)make.left.equalTo(superview).offset(5)make.centerY.equalTo(container)
}复制代码

于是,SnapKit 便能够将所有约束添加妥当。可以看到,这样的写法非常简洁明了,并且可读性高。

几个至关重要的 Tips :

  • 确定最佳父视图布置约束
  • 记住安装的约束以便在之后可以快速移除
  • 确保相关视图 setTranslatesAutoresizingMaskIntoConstraints(false)

相等(equalTo)之外

.equalTo 相当于 NSLayoutRelation.Equal

.lessThanOrEqualTo 相当于 NSLayoutRelation.LessThanOrEqual

.greaterThanOrEqualTo 相当于 NSLayoutRelation. GreaterThanOrEqual

这三个约束关系可接受以下某个参数:

1.视图属性
make.centerX.lessThanOrEqualTo(view2.snp.left)复制代码
2.某个视图 UIView/NSView

用于描述与其他视图之间的布局关系

// 这两行语句是等效的
make.left.greaterThanOrEqualTo(label)
make.left.greaterThanOrEqualTo(label.snp.left)复制代码
3.固定常量

用于描述本身的宽高约束

//  200 <= 宽度 <= 400
make.width.greaterThanOrEqualTo(200)
make.width.lessThanOrEqualTo(400)复制代码

用于描述与父视图的布局关系

// 创建约束使得 view.left <= view.superview.left + 10
make.left.lessThanOrEqualTo(10)复制代码

更多固定常量的示例

make.top.equalTo(42)
make.height.equalTo(20)
make.size.equalTo(CGSizeMake(50, 100))
make.edges.equalTo(UIEdgeInsetsMake(10, 0, 10, 0))
make.left.equalTo(view).offset(UIEdgeInsetsMake(10, 0, 10, 0))复制代码

学会应用约束的优先级

.priority 允许你指定某个约束的优先级

优先级一般跟在约束链的末尾:

make.top.equalTo(label.snp.top).priority(600)复制代码

组合多种约束

SnapKit 支持同时组合不同的约束条件,方便高效

边缘(edges)

make.edges.equalTo(view2);
make.edges.equalTo(superview).inset(UIEdgeInsetsMake(5, 10, 15, 20))复制代码
尺寸(size)
make.size.greaterThanOrEqualTo(titleLabel)
make.size.equalTo(superview).offset(CGSizeMake(100, -50))复制代码
居中(center)
make.center.equalTo(button1)
make.center.equalTo(superview).offset(CGPointMake(-5, 10))复制代码

懂得改变

有时我们需要通过改变一些现有的布局约束来实现动画,又或者是根据不同情况来调整布局,因此,SnapKit 也提供了不同的方式来实现。

1. 约束引用

即通过添加对应约束的全局引用变量,来实现对约束的控制

var topConstraint: Constraint? = nil...// 创建布局约束
view1.snp.makeConstraints { (make) -> Void inself.topConstraint = make.top.equalTo(superview).offset(padding.top).constraint //添加全局引用make.left.equalTo(superview).offset(padding.left)
}
...
// 之后若是要移除该约束
self.topConstraint.uninstall()// 或者更改该约束
self.topConstraint.updateOffset(5)复制代码

这个方式在大多数情况下有些繁琐,因此在开发工程中并不常用。

2. snp.updateConstraints
// 官方推荐在这个方法中来添加或更改布局
override func updateConstraints() {self.growingButton.snp.updateConstraints { (make) -> Void inmake.center.equalTo(self);make.width.equalTo(self.buttonSize.width).priority(250)make.height.equalTo(self.buttonSize.height).priority(250)make.width.lessThanOrEqualTo(self)make.height.lessThanOrEqualTo(self)}// 别忘记在最后调用父类的该方法super.updateConstraints()
}复制代码

这是在开发中最为常用的修改布局的方式

3. snp.remakeConstraints

这个方法与 snp.updateConstraints 十分相似,不同的是,这个方法会先将已存在的SnapKit布局约束全部移除。

func changeButtonPosition() {self.button.snp.remakeConstraints { (make) -> Void in make.size.equalTo(self.buttonSize)if topLeft {make.top.left.equalTo(10)} else {make.bottom.equalTo(self.view).offset(-10)make.right.equalTo(self.view).offset(-10)}}
}复制代码

总结

说白了,SnapKit 真的是手动 AutoLayout 的超级利器。
另外,它也有 Objective-C 版本,Masonry,设计理念与使用方法一致。

更多参考

  • 谈谈 DSL 以及 DSL 的应用
  • SnapKit Docs

掘金技术征文活动链接:

gold.xitu.io/post/58522d…

iOS 开发中的得力鲁班尺 - SnapKit | 掘金技术征文相关推荐

  1. Agora SDK 在Android中的使用(在线视频通话)| 掘金技术征文

    首先声明本文是Agora SDK入门的小白文章 一.集成 1.注册账号创建项目 其中最重要的要数 App ID 了 2.下载Agora SDK 二.学会看示例代码(可跳过) 1.整体了解项目结构(1v ...

  2. iOS 开发中的 Flux 架构模式

    本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...

  3. [贝聊科技]如何在iOS开发中更好的做假数据?

    当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI调试.然而做假数据方法不同,效率和安 ...

  4. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  5. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  6. iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用

    iOS 应用程序之间(1) 在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的 ...

  7. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  8. Xamarin iOS开发中的编辑、连接、运行

    Xamarin iOS开发中的编辑.连接.运行 创建好工程后,就可以单击Xamarin Studio上方的运行按钮,如图1.37所示,对HelloWorld项目进行编辑.连接以及运行了.运行效果如图1 ...

  9. ios开发中计算代码运算时间_iOS日历、日期、时间的计算

    时间和日历的计算在iOS开发中经常看到,经常看到大家在百度,开源中国等搜索这些答案.今天写个简单的时间和日历有关的计算. 获取一个月的总天数 1.获取当月的天数 - (NSInteger)getNum ...

最新文章

  1. python 抓取“煎蛋妹子图”并分页存在本地(普通版和多线程版)
  2. 邹伟博士出书啦!——《强化学习》从基础概念、核心原理到应用案例(文末赠书)...
  3. englishpod主持人对话文本_英语播客ESLPod学习方法+资源大全|Englishpod和eslpod的区别是什么...
  4. python简单使用
  5. 超级玛丽2014怀旧版发布
  6. php的优化参数有哪些,php 参数优化
  7. VS2010开发环境之使用技巧
  8. 观周教授新冠报告而作
  9. GitHub官网操作指南
  10. 商标注册流程,山东商标注册去哪好
  11. AES算法中S盒的FPGA实现 II
  12. RL(Chapter 3): Finite Markov Decision Processes (有限马尔可夫决策过程)
  13. URL 的参数(query)是什么,以及如何解析获取
  14. python语言单词_python单词_python 单词_python单词书 - 云+社区 - 腾讯云
  15. php swfupload handlers.js,SWFUpload 文件上传插件常用的配置讲解
  16. (附源码)计算机毕业设计SSM基于框架的报修系统
  17. 方法简单适合新手!把图片变音乐视频,上月收入7000多
  18. 宋词欣赏 李清照
  19. Mean Shift Segmentation Assessment for Individual Forest Tree Delineation from Airborne Lidar Data
  20. 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】

热门文章

  1. 正则表达式——贪婪非贪婪模式
  2. SEO优化网站教程4
  3. Go语言基础之接口(面向对象编程下)
  4. python 同花顺thstrader_Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)...
  5. RoboCup智能机器人足球教程(五)
  6. 原生JS代码100例
  7. kthreadd和init进程的启动(二)
  8. javascript解析json格式的数据
  9. 我对计算机类专业教学中一些问题的看法
  10. html 语言 回车 替换,标记语言——图片替换