ElegantSnap 一个优雅的,易用的iOS/tvOS/macOS自动布局框架, 超级详细的使用教程,多视图水平等宽/垂直等高排列
ElegantSnap
ElegantSnap(Base on SnapKit) to make Auto Layout easy and elegant on both iOS and OS X.
基于SnapKit, 用法简洁优雅,可运行在iOS、tvOS、macOS上自动布局库
Requirements / 使用条件
- iOS 10.0+ / Mac OS X 10.12+ / tvOS 10.0+
- Xcode 10.2+
- Swift 5.0+
Installation / 安装
CocoaPods
pod 'ElegantSnap'
Carthage
github "ZuopanYao/ElegantSnap"
Manually / 手动安装
If you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually.
如果您不喜欢以上管理依赖库的方式,则可以手动将 ElegantSnap 集成到项目中。
Usage / 使用
Compare with SnapKit / 与 SnapKit 比较
ElegantSnap | SnapKit |
---|---|
aView.make([.top()]) // aView.make([.top(nil, nil)]) // aView.make([.top(nil)]) |
aView.snp.makeConstraints { (make) in make.top.equalToSuperview() } |
aView.make([.top(20)]) // aView.make([.top(nil, 20)]) |
aView.snp.makeConstraints { (make) in make.top.equalToSuperview().offset(20) } |
aView.make([.top(base.snp.bottom)]) // aView.make([.top(base.snp.bottom, nil)]) |
aView.snp.makeConstraints { (make) in make.top.equalTo(base.snp.bottom) } |
aView.make([.top(base.snp.bottom, 20)]) | aView.snp.makeConstraints { (make) in make.top.equalTo(base.snp.bottom).offset(20) } |
... | ... |
aView.make([.width()]) // aView.make([.width(nil)]) |
aView.snp.makeConstraints { (make) in make.top.equalToSuperview() } |
aView.make([.width(200)]) | aView.snp.makeConstraints { (make) in make.width.equalTo(200) } |
aView.make([.width(base.snp.width)]) | aView.snp.makeConstraints { (make) in make.width.equalTo(base.snp.width) } |
... | ... |
Quick Start / 快速上手
Example 1 / 示例 1
import ElegantSnap
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
view.addSubview(aView, constraints: [.top(), .leading(), .width(200), .height(400)])
// view.addSubview(aView)
// aView.make([.top(), .leading(), .width(200), .height(400)])
}
}
equal to / 等同于
import SnapKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
view.addSubview(aView)
aView.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.leading.equalToSuperview()
make.width.equalTo(200)
make.height.equalTo(400)
}
}
}
Example 2 / 示例 2
import ElegantSnap
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
view.addSubview(aView, constraints: [.top(), .leading(), .width(200), .height(400)])
let myView = NSView()
view.addSubview(myView, constraints: [.top(aView.snp.bottom, 20), .leading(), .width(300), .height(aView.snp.height)])
}
}
equal to / 等同于
import SnapKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
view.addSubview(aView)
aView.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.leading.equalToSuperview()
make.width.equalTo(200)
make.height.equalTo(400)
}
let myView = NSView()
view.addSubview(myView)
myView.snp.makeConstraints { (make) in
make.top.equalTo(aView.snp.bottom).offset(20)
make.leading.equalToSuperview()
make.width.equalTo(300)
make.height.equalTo(aView.snp.height)
}
}
}
多视图排列
多个View等宽水平排列
import ElegantSnap
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
aView.wantsLayer = true
aView.layer?.backgroundColor = NSColor.red.cgColor
let bView = NSView()
bView.wantsLayer = true
bView.layer?.backgroundColor = NSColor.blue.cgColor
let cView = NSView()
cView.wantsLayer = true
cView.layer?.backgroundColor = NSColor.black.cgColor
let dView = NSView()
dView.wantsLayer = true
dView.layer?.backgroundColor = NSColor.purple.cgColor
view.addSubview([aView, bView, cView, dView],
constraints: [.height(80), .top(20)], spacing: (10, -10, 20), direction: .horizontal)
}
}
多个View等高垂直排列
import ElegantSnap
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let aView = NSView()
aView.wantsLayer = true
aView.layer?.backgroundColor = NSColor.red.cgColor
let bView = NSView()
bView.wantsLayer = true
bView.layer?.backgroundColor = NSColor.blue.cgColor
let cView = NSView()
cView.wantsLayer = true
cView.layer?.backgroundColor = NSColor.black.cgColor
let dView = NSView()
dView.wantsLayer = true
dView.layer?.backgroundColor = NSColor.purple.cgColor
view.addSubview([aView, bView, cView, dView],
constraints: [.width(80), .leading(20)], spacing: (10, -10, 20), direction: .vertical)
}
}
前往主页
ElegantSnap 一个优雅的,易用的iOS/tvOS/macOS自动布局框架, 超级详细的使用教程,多视图水平等宽/垂直等高排列的更多相关文章
- 让Python更优雅更易读(第二集)
友情链接 让Python更优雅更易读(第一集) 1.装饰器 1.1装饰器特别适合用来实现以下功能 运行时校验:在执行阶段进行特定校验,当校验通不过时终止执行. 适合原因:装饰器可以方便地在函数执行前介 ...
- 如果你恨一个程序员 忽悠他去做iOS开发(戏谑篇)
.state { text-align: right; height: 16px; line-height: 16px; color: #999; padding-top: 5px; overflow ...
- 一个简单、易用的Python命令行(terminal)进度条库
eprogress 是一个简单.易用的基于Python3的命令行(terminal)进度条库,可以自由选择使用单行显示.多行显示进度条或转圈加载方式,也可以混合使用. 示例 单行进度条 多行进度条 圆 ...
- 在PostgreSQL自定义一个“优雅”的type
是的,又是我,不要脸的又来混经验了.我们知道PostgreSQL是一个高度可扩展的数据库,这次我聊聊如何在PostgreSQL里创建一个优雅的type,如何理解优雅?大概就是不仅仅是type本身,其它 ...
- webview之如何设计一个优雅健壮的Android WebView?(下)(转)
转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...
- webview之如何设计一个优雅健壮的Android WebView?(上)(转)
转接:https://iluhcm.com/2017/12/10/design-an-elegant-and-powerful-android-webview-part-one/ 前言 Android ...
- 如何设计一个优雅健壮的Android WebView?(下)
转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...
- 如何设计一个优雅健壮的Android WebView?(上)
转:如何设计一个优雅健壮的Android WebView?(上) 前言 Android应用层的开发有几大模块,其中WebView是最重要的模块之一.网上能够搜索到的WebView资料可谓寥寥,Gith ...
- 用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名
生活中有很多场景都需要我们签字(签名),如果是一些不重要的场景,我们的签名好坏基本无所谓了,但如果是一些比较重要的场景,如果我们的签名比较差的话,就有可能给别人留下不太好的印象了,俗话说字如其人嘛,本 ...
随机推荐
- 16各种设计LOGO标准尺寸
继续抄写文章 网页设计标准尺寸: 1.800*600下,网页宽度保持在778以内, 2.1024*768下,网页宽度保持在1002以内, 3.在ps里面做网页可以在800*600状态下显 4.在PS里 ...
- Mybatis--映射器注解
因为最初设计时,MyBatis 是一个 XML 驱动的框架.配置信息是基于 XML 的,而且 映射语句也是定义在 XML 中的.而到了 MyBatis 3,有新的可用的选择了.MyBatis 3 构建 ...
- selenium之浏览器、元素、鼠标等操作总结
1 控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1 控制浏览器窗口大小 在不同的浏览 ...
- runR
Linux下使用R 运行linux下的R脚本 编写R文件 新建后缀名为R的文件 写入R程序 在脚本首行加入 1 运行R文件 这里有两种方式 大专栏 runR进入R的环境">进入R的环 ...
- word2vec的简单理解
word2vec研究如何将词用向量表示,使用的两个重要模型--CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gra ...
- Alberto Del Bimbo:为什么说研究员要有想象力?
Del Bimbo:为什么说研究员要有想象力?" title="Alberto Del Bimbo:为什么说研究员要有想象力?"> 说到科研,与日本式的&q ...
- 带你学习Javascript中的函数进阶(一)
1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式function关键字(命名函数) 函数表达式(匿名函数) new Function() var fn = new Function('参数 ...
- this软拷贝详解
<script> if( !Function.prototype.softBind ){ Function.prototype.softBind = function( obj ){ va ...
- typescript 02 数据类型
---恢复内容开始--- 1.数据类型 ts为了使代码更加规范并利于维护,增加了类型校验 提供了以下几种类型 布尔类型 boolean 数字类型 number 字符串类型 string 数组类型 ar ...
- 解决oninput事件在中文输入法下会取得拼音的值的问题
在做搜索等功能时,很多时候我们需要实时获取用户输入的值,而常常会得到类似 w'm 这样的拼音.为了解决这个问题,我在网上搜索了下相关问题,发现了两个陌生的事件:compositionstart 和 c ...