IOS高性能自動布局框架 AKTLayout

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
    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


orientation
orientation

通過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。


Demo1
Demo1
    // 藍色矩形布局
    [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
    animation
  1. 如果您僅僅需要暫時添加動畫

    [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)

  2. 非暫時修改

    [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)
AKTLayout架構(gòu)

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
    iOS
  • 關(guān)于參考復(fù)雜度


    Reference
    Reference

圖片展示了下文所測試的四種等級的視圖參考,簡單來講越復(fù)雜的參考view間的關(guān)系越復(fù)雜,某個view的變化將影響相關(guān)的view進行布局刷新。

這里我還需要解釋一下,為什么測試中要用這么多數(shù)量的View,有人說平時不可能遇到這么多view的情況。首先第一,數(shù)量多是為了便于觀察性能的消耗情況,第二我們關(guān)注的重點是不同布局方式的運行效率,有興趣的話可以自己將總時間換算成不同復(fù)雜度下的單個view布局的耗時。

  1. 布局的添加
AddLayout
AddLayout

view的數(shù)量線性增長,同時view的參考復(fù)雜度逐級提高(I~IIII)IIII級是接近日常使用中的參考復(fù)雜度的,Masonry添加布局效率衰減十分嚴重,在快速響應(yīng)的UITableView上使用Masonry是必卡無疑的。

  1. 布局更新
    更新布局
    更新布局

隨著布局復(fù)雜度的增長,NSLayoutConstraint布局更新效率下降嚴重,AKTLayout布局更新效率穩(wěn)定,由于手動布局無法自動更新所以在這里不參與比較。
運算量比值NSLayoutConstraint : AKTLayout 3: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評論 25 709
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,690評論 6 30
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,305評論 4 61
  • 某種生物只有在寫作時,才能思考。
    表象閱讀 355評論 0 1
  • 人的時間和精力是有限的。你怎樣利用你的時間和精力,決定了你成為什么樣的人。很多一點小欲望,多拿點吃的,多掙點小錢,...
    三不主義閱讀 231評論 0 0

友情鏈接更多精彩內(nèi)容