AKTLayout
https://github.com/AkteamYang/AKTKit.AKTLayout
AKTLayout是一個服務(wù)于IOS平臺的高性能自動布局框架,由于系統(tǒng)的自動布局在復(fù)雜的界面呈現(xiàn)中,性能衰減十分嚴重(Masonry、PureLayout、FLKAutoLayout...都是基于NSLayoutConstraint的自動布局書寫框架)。AKTLayout最初的目的僅僅是為了簡化手動布局時的代碼編寫,后來引入了高性能的內(nèi)建自動布局引擎,展現(xiàn)出令人驚喜的特性。
New update
V 1.2.0
更新日期2016.5.21
- 布局更新性能相比1.0.0提升約300%!
- 移除對于UIView生命周期的介入性操作,不再需要手動控制UIView的生命周期,降低使用成本
-
更新動畫接口
compare with v1.0.0
1.2.0版本布局更新性能的提升還是非常明顯的,主要更新了布局刷新的函數(shù)調(diào)用方式以及view的布局更新邏輯。由于view是相互參照的,某個view的變化會帶動相關(guān)聯(lián)的view的變化,在復(fù)雜布局中,這些關(guān)聯(lián)關(guān)系常常是有重疊的,這樣也就導(dǎo)致,同一個view可能被多次計算,理論上來講只有最后一次計算才是有效的。目前AKTLayout 1.2.0采用最為高效的工作方式自動忽略無效的計算。
New beginning

通過AKTLayout實現(xiàn)的自動布局
以圖片為中心,四周的矩形各有一個頂點和圖片頂點相連,色塊內(nèi)部的白色矩形為子視圖,參考了父視圖的中心點和兩個邊緣。
Setup
-
從GitHub手動獲取
1.從AKTKit.AKTLayout中下載資源文件
2.添加資源文件到你的Xcode工程中
3.導(dǎo)入頭文件
#import "AKTKit.h",“UIView+ViewAttribute.m”需要加入MRC編譯選項-fno-objc-arc -
使用CocoaPods
在Podfile中添加
pod 'AKTLayout', '~> 1.2.0'如果你的pod search AKTLayout搜索不到結(jié)果,可以pod setup更新一下本地pod倉庫
Usage
- Add layout
快速地書寫布局代碼,擁有較為豐富和易于使用的API。

// 藍色矩形布局
[v1 aktLayout:^(AKTLayoutShellAttribute *layout) {
// 中心點Y坐標與self.view中心點Y對齊
layout.centerY.equalTo(akt_view(self.view));
// 高度是self.view的高度的0.33倍
layout.height.equalTo(akt_view(self.view)).multiple(.33);
// 左邊緣與self.view左邊緣對齊
layout.left.equalTo(self.view.akt_left).offset(space);
// 右邊緣與self.view的中心點X坐標對齊并左偏移space/2
layout.right.equalTo(self.view.akt_centerX).offset(-space/2);
// 添加參考 enqualTo("AKTReference")
// 參考類型的創(chuàng)建(AKTReference):視圖、值、size、視圖的布局屬性
// 視圖: akt_value(VALUE)
// 值: akt_view(VIEW)
// size: akt_size(WIDTH, HEIGHT)
// 布局屬性: self.view.akt_left
}];
-
Animation
AKTLayout動畫的添加和普通的動畫添加沒有區(qū)別,僅僅需要在AKTLayout動畫環(huán)境代碼塊中提交您的動畫代碼
animation
-
如果您僅僅需要暫時添加動畫
[UIView aktAnimation:^{ [UIView animateWithDuration:1.f delay:0 usingSpringWithDamping:.3 initialSpringVelocity:.2 options:0 animations:^{ tap.enabled = NO; tap.view.frame = CGRectMake((self.view.width-150)/2, (self.view.height-150)/2, 150, 150); } completion:^(BOOL finished) { tap.enabled = YES; }]; }];在動畫代碼塊中修改frame,如果發(fā)生布局更新,界面將恢復(fù)到動畫前的狀態(tài)
-
非暫時修改
[UIView aktAnimation:^{ [UIView animateWithDuration:1.f delay:0 usingSpringWithDamping:.3 initialSpringVelocity:.2 options:0 animations:^{ tap.enabled = NO; [tap.view aktLayout:^(AKTLayoutShellAttribute *layout) { layout.centerXY.equalTo(akt_view(self.view)); layout.height.width.equalTo(akt_value(200)); }]; } completion:^(BOOL finished) { tap.enabled = YES; }]; }];在動畫代碼塊中重新添加AKTLayout,如果發(fā)生布局更新,界面將保持動畫后的狀態(tài),新的AKTLayout布局將會替換舊的。
Implementation architecture
- Architecture

AKTLayout架構(gòu)
AKTLayou頂層采用了基于Objective-C語法的shell,通過shell我們可以快速地書寫布局代碼,底層采用了基于純C的參考解析、參考運算系統(tǒng)和布局更新系統(tǒng)。
- Reference Type Supported
| vertical | horizontal | other |
|---|---|---|
| top | left | size |
| bottom | right | edgeInset |
| height | width | offset |
| centerY | centerX | multiple |
| whRation | whRation | * |
支持添加同級別跨級別視圖之間的相對參照,不支持自身布局屬性之間的參照和循環(huán)參照。
-
Performance Analysis
在復(fù)雜布局中應(yīng)用
NSLayoutConstraint來進行自動布局,性能往往不令人滿意。通常的做法是通過手寫frame布局來提升性能。AKTLayout采用高性能的布局添加和運算架構(gòu),響應(yīng)式布局更新算法,高效地實現(xiàn)自動布局。以下我們對frame、AKTLayout 和Masonry進行了性能比較(Platform:iPhone 6 SystemVersion:9.3.1)。
iOS -
關(guān)于參考復(fù)雜度
Reference
圖片展示了下文所測試的四種等級的視圖參考,簡單來講越復(fù)雜的參考view間的關(guān)系越復(fù)雜,某個view的變化將影響相關(guān)的view進行布局刷新。
這里我還需要解釋一下,為什么測試中要用這么多數(shù)量的View,有人說平時不可能遇到這么多view的情況。首先第一,數(shù)量多是為了便于觀察性能的消耗情況,第二我們關(guān)注的重點是不同布局方式的運行效率,有興趣的話可以自己將總時間換算成不同復(fù)雜度下的單個view布局的耗時。
- 布局的添加

view的數(shù)量線性增長,同時view的參考復(fù)雜度逐級提高(I~IIII)IIII級是接近日常使用中的參考復(fù)雜度的,Masonry添加布局效率衰減十分嚴重,在快速響應(yīng)的UITableView上使用Masonry是必卡無疑的。
-
布局更新
更新布局
隨著布局復(fù)雜度的增長,
NSLayoutConstraint布局更新效率下降嚴重,AKTLayout布局更新效率穩(wěn)定,由于手動布局無法自動更新所以在這里不參與比較。
運算量比值NSLayoutConstraint:AKTLayout3:1、13.4:1 、22.8:1
AKTLyout采用優(yōu)化的響應(yīng)式布局更新系統(tǒng),自動忽略無效的計算。當某個視圖布局發(fā)生變化時,自動重計算參照此視圖的視圖布局,在復(fù)雜的參照布局中依然保持高性能。
FAQ&Contact
目前已在9.0系統(tǒng)完成測試,低版本系統(tǒng)后續(xù)完成測試。
如果您在運行中發(fā)現(xiàn)了問題、對有些特性存在疑惑或者有pull request,你可以在issue創(chuàng)建一個問題。您也可以在我的簡書中進行評論,或者給我發(fā)送郵件battle0001@sina.com。
