Swift編程之SnapKit基本使用

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的偏移
        }

效果圖:

QQ20160404-3.png

當然,完全支持橫屏,我這里就不放圖片了.
與上面使用的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:


QQ20160404-1.png

多點幾下就是這樣


QQ20160404-2.png

約束更新&重做約束:

  • 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.第一次在簡書寫文章,也是新手,如果有出錯的地方,希望能指出,我會進行修改涤浇!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末邪码,一起剝皮案震驚了整個濱河市谢揪,隨后出現的幾起案子扭弧,更是在濱河造成了極大的恐慌阎姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸽捻,死亡現場離奇詭異呼巴,居然都是意外死亡,警方通過查閱死者的電腦和手機御蒲,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門衣赶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厚满,你說我怎么就攤上這事屑埋。” “怎么了痰滋?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長续崖。 經常有香客問我敲街,道長,這世上最難降的妖魔是什么严望? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任多艇,我火速辦了婚禮,結果婚禮上像吻,老公的妹妹穿的比我還像新娘峻黍。我一直安慰自己,他們只是感情好拨匆,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布姆涩。 她就那樣靜靜地躺著,像睡著了一般惭每。 火紅的嫁衣襯著肌膚如雪骨饿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音宏赘,去河邊找鬼绒北。 笑死,一個胖子當著我的面吹牛察署,可吹牛的內容都是我干的闷游。 我是一名探鬼主播贴汪,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘶是,長吁一口氣:“原來是場噩夢啊……” “哼钙勃!你這毒婦竟也來了?” 一聲冷哼從身側響起聂喇,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤希太,失蹤者是張志新(化名)和其女友劉穎克饶,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體誊辉,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡堕澄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年蛙紫,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑傅。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唁毒,死狀恐怖,靈堂內的尸體忽然破棺而出粉私,到底是詐尸還是另有隱情近零,我是刑警寧澤崔泵,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布憎瘸,位于F島的核電站陈瘦,受9級特大地震影響,放射性物質發(fā)生泄漏痊项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一皱埠、第九天 我趴在偏房一處隱蔽的房頂上張望边器。 院中可真熱鬧托修,春花似錦忘巧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兴泥。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間好唯,已是汗流浹背燥翅。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工森书, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谎势,地道東北人杨名。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓台谍,卻偏偏與公主長得像趁蕊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掷伙,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容