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 11 Override clone judiciously

    Principles If you override the clone method in a nonfinal class, you should return an object obtaine ...

  2. IIS does not list a website that matches the launch url

    233down voteaccepted I hate answering my questions: in my question i stated that i was running VS un ...

  3. 读书笔记——Windows核心编程(8)Interlocked系列函数

    先让我们来复习下小学知识 A+B=C//式中A为被加数,B为加数. A-B=C//式中A为被减数,B为减数. 再让我们来明确一个知识点:返回值为void的Windows函数意味着一定会执行成功. -- ...

  4. 使用Number.parseFloat引发的悲剧

    起因: 前几天,项目中有人用了Number.parseFloat(xxx)方法.在Chrome和FF中是可以使用的.然而在IE中却报错,提示不存在这个function. Solution: 经查Jav ...

  5. 02_嵌套矩形(DAG最长路问题)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...

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

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

  7. AFHTTPClient的异步回调模式

    以前第一个版本,ios的http都用的同步模式,在很多地方会导致线程阻塞,自己开发了一个简易的AFHTTPClient的异步回调模式. 回调的protocol: @protocol MyAFNetwo ...

  8. Sql practice

    employee表 数据准备 use tempdb go if OBJECT_ID('employee') is not null drop table employee ;with employee ...

  9. List与Set的使用

    接口Collection: Collection是Java的一个集合框架, 也是一个根接口.JDK中没有提供此接口的任何实现,但是提供了更具体的子接口Set和List接口的实现,所有的Collecti ...

  10. 二分法 organ Saltless

    organ [描述] 现在某组织中(记作R)有n个人,他们的联络网形成一棵以Saltless为根的树,有边相连代表两人可以直接联络. 每个人有一个代号,Saltless代号为1,且除Saltless外 ...