OC下的autolayout神器Masonry大家已经很熟悉了。但是masonry在swift下使用并不方便。所以同一个团队开发出了swift下的autolayout库:SnapKit
snapkit从0.14开始支持swift2.0并且支持iOS7。不过常规的导入方法只支持iOS8.0+。

  • 1 GitHub链接:https://github.com/SnapKit/SnapKit
  • 学习一下第三方的约束管理。其中SnapKit适用于Swift,Masonry适用于OC。

  • 2、安装:

    1.直接下载:在Github上下载SnapKit,找到SnapKit.framework,然后放到自己的工程中即可。SnapKit.framework文件包括:

    屏幕快照 2016-04-08 上午11.47.00.png

    2.Cocoapods安装

     在项目的Podfile下添加如下信息
    
     在终端中执行:pod install(注意路径是当前项目中Podfile锁在路径)
        platform :ios, '8.0'
    
        use_frameworks!
    
         target '你的工程名称' do
    
         pod 'SnapKit'
    
         end

    SnapKit本身不支持IOS7,如果希望SnapKit支持IOS7版本,需要在自己的项目的 Build Setting 中搜索的 OTHER_SWIFT_FLAGS,在其下面添加 -DSNAPKIT_DEPLOYMENT_LEGACY,如下图所示:(否则会报错!)

     

    在使用之前,先看一下Snapkit官方文档翻译

  • swift
    let box = UIView()
    superview.addSubview(box)
    box.snp_makeConstraints { (make) -> Void in
        //注释:box距离父视图上下左右边距都是20像素
        make.edges.equalTo(superview).inset(UIEdgeInsetsMake(20, 20, 20, 20))
    }
  • 如果你想 视图 view.left 大于等于 label.left ,执行下面代码:

    swift
    //下面这两者的约束是完全一样的
    make.left.greaterThanOrEqualTo(label)
    make.left.greaterThanOrEqualTo(label.snp_left)
  • 3.严格检测(Strick Checks)
    swift
    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))
  • 4.学习优先级

    • priority: 允许您指定一个确切的优先级
    • priorityHigh: 高优先级 等价于 UILayoutPriority.DefaultHigh
    • priorityMedium:中优先级
    • priorityLow:低优先级 UILayoutPriority.DefaultLow

    优先级可以放在约束链的结束处,例如

    swift
    //当前视图的左边>=label的底部 低优先级
    make.left.greaterThanOrEqualTo(label.snp_left).priorityLow()
    //当前视图与label的顶部齐平,优先级:600
    make.top.equalTo(label.snp_top).priority(600)
  • 5.组成,组成,组成
    SnapKit 也可以提供一些便利的方法来同时创建多约束

    1.edges(边缘)

    swift
    //让当前视图 的 上下左右(top,left,bottom,right) 等于 view2
    make.edges.equalTo(view2)
    // make top = superview.top + 5; left = superview.left +10
    // bottom = superview.bottom -15; right = superview.right - 20
    make.edges.equalTo(superView).inset(UIEdgeInsetsMake(5,10,15,20))

    2.size(尺寸)

    swift
    //当前视图宽高 >= titleLabel
    make.size.greaterThanOrEqualTo(titleLabel)
    //make width = superview.width + 100; height = superview.height -50
    //即 当前视图宽 = 父视图 + 100,高 = 父视图.高 - 50
    make.size.equalTo(superview).offset(CGSizeMake(100, -50))

    3.center(中心)

    swift
    //当前视图与 button1中心相同 (centerX 和 centerY)
    make.center.equalTo(button1)
    //make centerX = superview.centerX - 5; centerY = superview.centerY +10
    make.center.equalTo(superview).offset(CGPointMake(-5,10))
  • 可以串连视图属性增加可读性

    swift
    //所有边缘除了top都等于父视图, top为20
    make.left.right.bottom.equalTo(superview)
    make.top.equalTo(20)
  • 6.Hold on for dear life

    有时候你需要修改已经存在的约束为了移动或者移除、代替约束。在SnapKit 有一些不同的方法更新约束

    1.引用(References)
    你可以通过将约束的结果赋值给一个局部变量或一个类属性来保持一个特定的约束的引用。您还可以将多个约束引用存储在数组中。

    swift
    var topConstraint: Constraint? = nil
    
    //当制作约束时
    view1.snp_makeConstraints{ (make) -> Void in
            self.topConstrain = 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(更新约束)
    如果你仅仅想更新一个常数给一个约束,你可以使用方法snp_updateConstraints来代替snp_makeConstraints

    swift
    //这是一个苹果官方推荐的添加和更新约束的地方
    //这个方法在响应<code>setNeedsUpdateConstraints</code>多次调用
    //这个方法可以倍UIKit调用
    override func updateConstraints() {
            self.growingButton.snp_updateConstraints{ (make) -> Void in
                    make.center.equalTo(self);
                    make.width.equalTo(self.buttonSize.width).priorityLow()
                    make.height.equalTo(self.buttonSize.height).priorityLow()
                    make.width.lessThanOrEqualTo(self)
                    make.height.lessThanOrEqualTo(self)
            }
    
            //父类可以调用
            super.updateConstraints()
    }

    3.snp_remakeConstraints(重做约束)
    snp_remakeConstraints与snp_makeConstraints类似,但是首先会先清除掉所有被SnapKit设置的约束

    swift
    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)
                    }
            }
    }

更简单地进行Auto Layout--SnapKit 支持swift的更多相关文章

  1. 从 Auto Layout 的布局算法谈性能

    这是使用 ASDK 性能调优系列的第二篇文章,前一篇文章中讲到了如何提升 iOS 应用的渲染性能,你可以点击 这里 了解这部分的内容. http://t.cn/Rc4KbUC 在上一篇文章中,我们提到 ...

  2. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  3. 【转】使用 Auto Layout 的典型痛点和技巧

    layoutIfNeeded()强制立刻更新布局 原文网址:http://www.jianshu.com/p/0f031606e5f2 官方文档:Auto Layout Guide 加上去年WWDC上 ...

  4. 深入理解Auto Layout 第一弹

    本文转载至 http://zhangbuhuai.com/2015/07/16/beginning-auto-layout-part-1/ By 张不坏 2015-07-16 更新日期:2015-07 ...

  5. WWDC2018 之 高性能 Auto Layout

    1. 关于 Auto Layout 的历史渊源 上世纪 90 年代,名叫 Cassowary的布局算法,通过将布局问题抽象成线性不等式,并分解成多个位置间的约束,解决了用户界面的布局问题. Apple ...

  6. Auto Layout深入理解,及masonry简单介绍

    本篇博客是本人在学习自己主动布局过程中对自己主动布局的理解和整理,分三部分介绍,内容可能会有所反复.见谅. 一.autosizing与Auto Layout对照,及Auto Layout简单介绍 1. ...

  7. ios8来了,屏幕更大,准备好使用 iOS Auto Layout了吗?

    引言: Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 要完全掌握Au ...

  8. swift 约束 - SnapKit 适配iPhoneX 安全区 和苹果自带的VFL ,auto layout 安全区适配

    这里tableview 是从最顶上的安全区适配的, nextBtn是最下边从安全区设置的,如果是在中间的view还是原来的写法,看2 1.安全区适配适用于Vc里面, 如果是自定义的view或封装的vi ...

  9. Auto Layout简单应用——以编码的方式实现Auto Layout自动布局(二)

    在上一篇文章iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)中我们简单的介绍了使用Visual Format Language创建布局约束来实现自动布局,这种方法创建的布局约 ...

随机推荐

  1. Effective Java 02 Consider a builder when faced with many constructor parameters

    Advantage It simulates named optional parameters which is easily used to client API. Detect the inva ...

  2. Effective Java 68 Prefer executors and tasks to threads

    Principle The general mechanism for executing tasks is the executor service. If you think in terms o ...

  3. FiddlerScript修改特定请求参数下的返回值

    使用场景: api/Live/GetLiveList接口: (1)Type为1,接口返回直播列表 (2)Type为2,接口返回回放列表 现在想修改直播列表的返回值 思路: 利用FiddlerScrip ...

  4. jmeter接口测试教程

    一.Jmeter接口测试步骤: 1.添加线程组

  5. 转载的vim配置文件

    """"""""""""""""&quo ...

  6. mysql启动不成功显示The server quit without updating PID file的解决方法

    上午在编译安装mysql的时候 就出现标题中的错误,经实践在第二步操作后启动成功,参考链接 链接http://linuxadministrator.pro/blog/?p=225 You may fa ...

  7. [转]Oracle分页之二:自定义web分页控件的封装

    本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018326.html 上节中,讲述的就是Oracle存储过程分页的使用方式,但是如 ...

  8. [转]移动web开发中meta标签作用

    今天在尝试做移动页面的时候遇到了一个问题,<meta content="telephone=no,email=no" name="format-detection& ...

  9. jemter的使用(二)

    在上篇文章中介绍了如何在jmeter中添加请求,并执行查看结果,下面介绍一下,在运行时需要用到的一些管理器 一.HTTP信息头管理器 1.添加信息头管理器 2.添加变量和值,如:Content-Typ ...

  10. lock与C#多线程

    lock与C#多线程 lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁.简单讲就类似于 你去银行办理业务,一个柜台一次只能操作以为客户,而如果你要到这个柜台办理 ...