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. android图片缓存(包含ReusableBitmapDrawable和BitmapPool)

    现在做的项目中,有用到一个开源的2D地图框架osmdroid,但是在项目中,使用还是有一些问题,例如,多个地图实例,会有独自的图片缓存,Activity onPause时,并不会释放图片缓存,如果多级 ...

  2. C# Ftp文件处理

    1.创建文件夹 /// <summary> /// ftp创建文件夹(只能创建单层目录) /// </summary> /// <param name="Uri ...

  3. Java内存模型的历史变迁

    转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍J ...

  4. CSS元素类型

    前面有一篇文章讲到在css世界中,html元素的表现都是一个个盒子,而css中盒子的显示方式有三种方式,分别是块元素.行内元素和行内块元素.本文总结这三种显示方式的特征和区别. 1 写在前面 最近在整 ...

  5. Tomcat常用的优化技巧

    (1)屏蔽DNS查询 Web应用程序可以通过Web容器提供的getRemoteHost()方法获得访问Web应用客户的IP地址和名称,但是这样会消耗Web容器的资源,并且还需要通过IP地址和DNS服务 ...

  6. Python 部署项目(Tomcat 容器)

    此前书写了多实例的 Tomcat 启动等操作的脚本,今天完善 Tomcat 多实例部署(本脚本只提供思路) 脚本内容: #!/usr/bin/env python # _*_coding:utf-8_ ...

  7. Linux 常用命令行

    Linux常用命令行 第一部分: cd命令 第二部分:文件操作 第三部分:压缩包操作

  8. 重载 && 重载递增递和减运算符

    class Rule { private: double m_Length; public: explicit Rule(double lg = 1.0) :m_Length{ lg }{} Rule ...

  9. 03_汇编语言(n个数找最大值)

    程序要求: 先输入一个数n(0<n<=100),再输入n个无符号数K(0<=K<=65535),找出这n个数的最大值并输出 测试实例保证输入每个数之后,都会以回车结束 代码: ...

  10. uva 12655 Trucks [LCA](树链剖分+MST)

    The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...