swift技术文章收藏借鉴Swift开发那些事移动开发

Swift编程之SnapKit基本使用

2016-04-04  本文已影响12180人  那就这样咯

SanpKit最新版本支持了Swift3,Swift2迁移至3的时候只需要先更新至最新版本然后进入你的工程(注意是工程,而不是workspace)搜索:snp_然后替换为:snp.

--以下是原文--

SnapKit是大神@Robert Payne写的Masonry的Swift版本,其使用方式也与Masonry的使用方法极其类似.本文主要介绍一下在Swift中SnapKit的简单使用.

导入Swift:

1),通过cocoapdos安装,如果不会用cocoapods的话可以去看看code4app的这篇博客
Podfile配置如下:

platform :ios, '8.0'
use_frameworks!
target '你的工程名称' do
pod 'SnapKit'
end

2),直接将SnapKit拖进工程目录,到SnapKit的Github点击Download Zip按钮下载SnapKit工程文件,解压后把其中的SnapKit.xcodeproj文件直接拖进工程即可.切记确保SnapKit工程下的所有需要的支持文件全都被拖过去了.(SnapKit工程本身不支持iOS7或之前的系统,如果需要支持iOS7的话请考虑此方法导入.)

简单使用

举个小栗子,使一个相对当前View居中并且大小为200*100

        let redView = UIView()
        redView.backgroundColor = UIColor.redColor()
        self.view.addSubview(redView)
        redView.snp_makeConstraints { (make) in
            make.edges.equalTo(self.view).inset(UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20))//将redView的边界约束为self.view并且每条边都是20的偏移
        }

效果图:

QQ20160404-3.png
当然,完全支持横屏,我这里就不放图片了.
与上面使用的edges相似的其他属性:
边界: left,right,top,bottom,edges,leading,trailing
(left与leading的区别,left始终代表view的左边,而leading代表view的布局起点,如果是从左到右布局则代表view的左边,其他的以此类推)
尺寸,大小:width,height,size
(如果需要在.equalTo或其他函数中使用这些属性,则要使用其对应的snp_top,snp_bottom.....版本)
优先级:priority,一般用在约束语句链的最后面,例如
make.bottom.equalTo(self.view).priorityLow()//低优先级
//也可以使用priority()方法传入具体优先级的级别,(0-1000)

与equalTo相似的其他约束函数:
小于等于:lessThanOrEqualTo
大于等于:greaterThanOrEqualTo
我最经常使用lessThanOrEqualTo或者greaterThanOrEqualTo是针对于UILabel的约束,如果有这么个需求:文字长度如果短于某个值,则让label适应文字宽度,如果长于这个值的话,则让label的宽度固定,高度适应其文本,那么这里的"小于等于"就派上用场了,看代码:

        self.label.text = "这是一个很长的字符串"
         self.label.numberOfLines = 0
        self.view.addSubview(self.label)
        label.snp_makeConstraints { (make) in
            make.center.equalTo(self.view)
            make.width.lessThanOrEqualTo(self.view).offset(-50)//只需要约束宽度即可,这里约束的最大宽度为屏幕宽度-50,事实上如果没有其他需求的话针对于一个label来说只需要确定一个位置,不需要大小就可以认定这是一个完整的约束.(此技能目前我只知道针对于UILabel,UIImageView,UIButton有效)
        }

然后我们在控制器的touchesBegan里面这么写

            self.label.text! += self.label.text!

在初始状态的label:


QQ20160404-1.png

多点几下就是这样


QQ20160404-2.png

约束更新&重做约束:

SnapKit中没有类似于Masonry中的给一组View进行约束的方法.

一些小Tips

对于在UIScrollView上使用自动布局,scrollView的子视图务必四周都对scrollView进行约束,原因很简单:scrollView的滑动是依赖其属性contentSize,如果这个size小于scrollView视图本身的话就不能滑动,添加子视图的时候对四周做约束就相当于把contentSize"撑"开了,帮助其确定子控件也就是其contentSize大小.

AutoLayout针对于UILabel,UIImageView,UIButton来说,只需要确定其位置(x轴与y轴),便可以算是一个完整的约束,不同的是UILabel会根据其文字内容来确定控件大小,UIButton在没有标题的情况下同样如此,UIImageView以及设置了image的UIButton,一般会根据图片的大小来确定控件大小,所以对于带image的button以及UIImageView来说,最好还是要加上针对于四周的约束.
补充一点,有时候我们的需求是,不管是横屏还是竖屏,View刚好在导航栏下面,我们都知道导航栏加上状态栏是64的高度,而横屏状态下是没有状态栏的,针对这一点其实Masonry还有SnapKit都有针对这种情况的解决方案.在SnapKit的UIViewController+SnapKit.swift文件中,给UIViewController加了这样几个属性:

snp_topLayoutGuideTop//顾名思义,这里的topLayoutGuide一般指的是导航栏

snp_topLayoutGuideBottom

snp_bottomLayoutGuideTop//这里的bottomLayoutGuide一般指的是Tabbar
snp_bottomLayoutGuideBottom
那么guideTop,guideBottom就是针对导航栏或者tabbar的顶部与底部

PS.第一次在简书写文章,也是新手,如果有出错的地方,希望能指出,我会进行修改!

上一篇 下一篇

猜你喜欢

热点阅读