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或之前的系統(tǒng),如果需要支持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的偏移
}
效果圖:
當然,完全支持橫屏,我這里就不放圖片了.
與上面使用的edges相似的其他屬性:
邊界:
left,right,top,bottom,edges,leading,trailing
(left與leading的區(qū)別,left始終代表view的左邊,而leading代表view的布局起點,如果是從左到右布局則代表view的左邊,其他的以此類推)
尺寸,大小:width,height,size
(如果需要在.equalTo或其他函數中使用這些屬性,則要使用其對應的snp_top,snp_bottom.....版本)
優(yōu)先級:priority,一般用在約束語句鏈的最后面,例如
make.bottom.equalTo(self.view).priorityLow()//低優(yōu)先級
//也可以使用priority()方法傳入具體優(yōu)先級的級別,(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!
在初始狀態(tài)的label:
多點幾下就是這樣
約束更新&重做約束:
- SnapKit內置snp_updateConstraints方法用來更新約束.其內部寫法與加約束的方式一致,需要注意的是,所謂的更新也就意味著砸原有的基礎上進行修改,所以說更新約束必須要和加約束的時候相對應,比如說你在snp_makeConstraints中給一個View加了一個針對于center的約束,在更新約束時就只能修改針對于這個center的約束,否則的話你只能得到一個警報
- 重做約束,snp_remakeConstraints,這個理解起來就很簡單了,實現這個方法之后會移除view之前所有的約束然后重新添加約束.
(更新約束之后如果需要立即體現出來的話,可以先對更新約束的父View調用setNeedsLayout()使父view進入需要更新布局的狀態(tài),其次再layoutIfNeeded()更新布局,如果需要動畫的話,把layoutIfNeeded()放到動畫過程里面即可)
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剛好在導航欄下面,我們都知道導航欄加上狀態(tài)欄是64的高度,而橫屏狀態(tài)下是沒有狀態(tài)欄的,針對這一點其實Masonry還有SnapKit都有針對這種情況的解決方案.在SnapKit的UIViewController+SnapKit.swift
文件中,給UIViewController
加了這樣幾個屬性:
snp_topLayoutGuideTop//顧名思義,這里的topLayoutGuide一般指的是導航欄
snp_topLayoutGuideBottom
snp_bottomLayoutGuideTop//這里的bottomLayoutGuide一般指的是Tabbar
snp_bottomLayoutGuideBottom
那么guideTop,guideBottom就是針對導航欄或者tabbar的頂部與底部
PS.第一次在簡書寫文章,也是新手,如果有出錯的地方,希望能指出,我會進行修改涤浇!