再看SnapKit

連續(xù)兩個(gè)多月高強(qiáng)度的工作山涡,每天幾乎加班到8點(diǎn)才下班,項(xiàng)目在今天上午終于是提交到 App Store 了必怜。整個(gè)人瞬時(shí)如釋重負(fù)肉拓,但卻有種空虛感,不知道做什么了梳庆。再看下SnapKit吧暖途。發(fā)現(xiàn)之前一直認(rèn)為就那么用來設(shè)置約束即可,沒留意到的地方還挺多膏执。下面分別概述下驻售。

一、inset 和 offset

相信大部分小伙伴們都是使用 offset 來控制邊距的吧更米。

cciView.snp.makeConstraints { (make) in
    make.top.equalTo(researchView.snp.bottom).offset(kHeight.d10)
    make.left.equalTo(10)
    make.right.equalTo(-10)
    make.bottom.equalTo(bottomView.snp.bottom)
}

其實(shí) offset 使用的是絕對(duì)值欺栗,尤其是設(shè)置右、下約束的時(shí)候征峦,子控件相對(duì)于父控件都需要加-號(hào)迟几。這一點(diǎn)使用久了,和蘋果的 xib 比起來栏笆,或多或少覺得有點(diǎn)不太合理类腮。其實(shí)該框架是有 inset 來抽象控制的。下面貼下框架的源碼:

public class ConstraintMakerEditable: ConstraintMakerPriortizable {
    
    @discardableResult
    public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {
        self.description.multiplier = amount
        return self
    }
    
    @discardableResult
    public func dividedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {
        return self.multipliedBy(1.0 / amount.constraintMultiplierTargetValue)
    }
    
    @discardableResult
    public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable {
        self.description.constant = amount.constraintOffsetTargetValue
        return self
    }
    
    @discardableResult
    public func inset(_ amount: ConstraintInsetTarget) -> ConstraintMakerEditable {
        self.description.constant = amount.constraintInsetTargetValue
        return self
    }
    
}

使用 inset蛉加,之前的代碼就可以簡(jiǎn)化成這樣(只是舉例):

   make.top.equalTo(researchView.snp.bottom).offset(kHeight.d10)
        make.left.equalTo(10)
        make.right.equalToSuperview().inset(10)
        make.bottom.equalTo(bottomView.snp.bottom)
    }

總結(jié)下來就是:在描述 view 與 superview 關(guān)系時(shí)蚜枢,應(yīng)該使用 inset,而描述 view 與同一層級(jí)的其它 view 時(shí)针饥,應(yīng)該使用 offset厂抽。

二、ConstraintConstantTarget

在布局 view 的時(shí)候丁眼,一般來說設(shè)計(jì)師都會(huì)給 content 一個(gè)統(tǒng)一的邊距筷凤,類似于 html 中的 padding,在構(gòu)建約束時(shí)我們經(jīng)常會(huì)把這個(gè) padding 分散到各處户盯。但事實(shí)上,將 padding 分散去處理是一件很糟糕的事情饲化,代碼不美觀是其次莽鸭,最重要的是后期維護(hù)起來費(fèi)時(shí)費(fèi)力,更好的方式是使用已有的抽象 UIEdgeInsets吃靠。

在調(diào)用 equalTo, offset 或者 inset 傳入數(shù)值時(shí)硫眨,我們會(huì)發(fā)現(xiàn)傳入的參數(shù)類型實(shí)際上只有 ConstraintConstantTarget,這是一個(gè)協(xié)議巢块,SnapKit 把它作為一個(gè)類簇在使用礁阁,通過一個(gè)方法將它轉(zhuǎn)化為 CGFloat 來作為 constraint 的 constant巧号。

UIEdgeInsets 也遵循了這個(gè)協(xié)議,所以我們可以更加優(yōu)雅地去處理邊距:

//  如果視覺稿中所有的頁面的左右邊距都遵循左右距離相同姥闭,該屬性可以改為全局屬性丹鸿。
let containerInsets = UIEdgeInsets(top: 5, left: 15, bottom: 5, right:15)

container.addSubview(a)
container.addSubview(b)

a.snp.makeConstraints {
    $0.top.left.right.equalToSuperview().inset(containerInsets)
}

b.snp.makeConstraints {
    $0.top.equalTo(a.snp.bottom).offset(5)
    $0.left.bottom.right.equalToSuperview().inset(containerInsets)
}

這樣,后期修改起來會(huì)很容易棚品,代碼也簡(jiǎn)潔了很多靠欢。另外 CGPoint 和 CGSize 也遵循了這個(gè)協(xié)議,大家可以去研究下更多有趣的用法铜跑,例如 size.equalTo(20)门怪。

三、修改約束盡量用 updateConstraints

如果要更新布局約束锅纺,小弟之前的做法是仿照蘋果掷空,用局部變量來引用,然后更新囤锉。如下:

// 局部變量保存約束屬性
private var bottomViewConsT: Constraint?

// 展示 view 時(shí)更新底部約束
bottomViewConsT?.update(offset: -tmpBottomConsH)
UIView.animate(withDuration: kTime.duration, animations: {[weak self] in
        self?.layoutIfNeeded()
}) {  (_) in
}

// 設(shè)置約束
bottomView.snp.makeConstraints { (make) in
    make.left.right.equalTo(self).offset(0)
    make.height.equalTo(frame.height * 0.35)
    bottomViewConsT = make.top.equalTo(self.snp.bottom).offset(0).constraint
    }

// 隱藏 view 時(shí)更新底部約束
bottomViewConsT?.update(offset: 0)
  UIView.animate(withDuration: 0.1, animations: { [weak self] in
    self?.layoutIfNeeded()
}) { [weak self] (_) in
    self?.removeFromSuperview()
}

其實(shí)可以改為:

// 展示 view 時(shí)更新底部約束
bottomView.snp.updateConstraints { (make) in
    make.top.equalTo(self.snp.bottom).inset(0)
}

// 設(shè)置約束
bottomView.snp.makeConstraints { (make) in
    make.left.right.equalTo(self).offset(0)
    make.height.equalTo(frame.height * 0.35)
    bottomViewConsT = make.top.equalTo(self.snp.bottom).offset(0).constraint
}
// ……

這么做的好處就是語法更簡(jiǎn)潔一致坦弟,讓約束表現(xiàn)得更像是 view 的屬性。但缺點(diǎn)也很明顯嚼锄,只能更新 constant减拭。

暫時(shí)就這些吧(^_^)~~~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市区丑,隨后出現(xiàn)的幾起案子拧粪,更是在濱河造成了極大的恐慌,老刑警劉巖沧侥,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可霎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宴杀,警方通過查閱死者的電腦和手機(jī)癣朗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺罢,“玉大人旷余,你說我怎么就攤上這事”獯铮” “怎么了正卧?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)跪解。 經(jīng)常有香客問我炉旷,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任窘行,我火速辦了婚禮饥追,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罐盔。我一直安慰自己但绕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布翘骂。 她就那樣靜靜地躺著壁熄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碳竟。 梳的紋絲不亂的頭發(fā)上草丧,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音莹桅,去河邊找鬼昌执。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诈泼,可吹牛的內(nèi)容都是我干的懂拾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼铐达,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岖赋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓮孙,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤唐断,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杭抠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脸甘,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年偏灿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丹诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翁垂,死狀恐怖铆遭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沿猜,我是刑警寧澤枚荣,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站邢疙,受9級(jí)特大地震影響棍弄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疟游,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一呼畸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颁虐,春花似錦蛮原、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笋籽,卻和暖如春蹦漠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背车海。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工笛园, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侍芝。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓研铆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親州叠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棵红,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS_autoLayout_Masonry 概述 Masonry是一個(gè)輕量級(jí)的布局框架與更好的包裝AutoLay...
    指尖的跳動(dòng)閱讀 1,165評(píng)論 1 4
  • 一、前言 關(guān)于蘋果的布局一直是我比較糾結(jié)的問題咧栗,是寫代碼來控制布局逆甜,還是使用storyboard來控制布局呢?以前...
    iplaycodex閱讀 2,452評(píng)論 0 1
  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語法 采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布...
    木易林1閱讀 2,338評(píng)論 0 3
  • Masonry是一個(gè)輕量級(jí)的布局框架楼熄,擁有自己的描述語法忆绰,采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布局,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,768評(píng)論 0 1
  • 價(jià)值放大者是依靠平臺(tái)或財(cái)富的力量去撬動(dòng)企業(yè)和項(xiàng)目的成長(zhǎng)可岂,他們往往是大平臺(tái)的擁有者或財(cái)團(tuán)掌控者错敢,比如馬云、馬化騰缕粹、李...
    大施哥說閱讀 672評(píng)論 0 0