MBProgressHUD原始碼分析

2021-07-08 19:42:58 字數 1924 閱讀 6955

mbprogresshud是objective-c寫的第三方庫,用來作為進度指示器使用,原版objective-c實現,當然,也有swift實現,本文是依據原作者的objective-c原始碼來分析的。

mbprogresshud使用時本質是乙個尺寸為螢幕尺寸(顯示時能完全遮住其它檢視)的uiview,而最好將它新增到視窗上或者視窗的根檢視控制器的根檢視上。

mbprogresshud上主要由三個子檢視:

當然,這三個檢視不一定會同時顯示。mbprogresshud有三個初始化方法(使用時是呼叫前兩個方法,而前兩個初始化方法內部是呼叫第三個方法):

- (id)initwithview:(uiview *)view
- (id)initwithwindow:(uiwindow *)window
- (id)initwithframe:(cgrect)frame //這裡的frame是hud直接父檢視的frame,一般是視窗大小

設定了一些預設的屬性,並且對子控制項布局、邏輯進行了處理,子控制項已新增到hud上,只是沒有設定其frame。

<1>[self setuplabels];

新增兩個label(label、detailslabel,剛開始的frame都是hud的frame)

<2>[self updateindicators];

會對mode(指示器的模式:系統的uiactivityindicatorview、環形指示器、條狀指示器、沒有指示器)進行判斷,而mode屬性的定義為(@property (assign) mbprogresshudmode mode;)在指示器的位置(即同一位置)根據不同需求設定不同樣式的指示器(即不同的view,要將原來的指示器移除[indicator removefromsuperview];)

<3>[self registerforkvo];

利用kvo對hud物件的某些屬性進行值改變時的監聽。

監聽的物件屬性有: [nsarray arraywithobjects:@"mode", @"customview", @"labeltext", @"labelfont", @"labelcolor",

@"detailslabeltext", @"detailslabelfont", @"detailslabelcolor", @"progress", @"activityindicatorcolor", nil];

} <4>[self registerfornotifications];

利用nsnotification對狀態條方向方式改變進行監聽

mbprogresshud並不只是中心顯示的檢視,它其實是佔據了整個螢幕,在layoutsubviews方法中計算除了中心檢視的尺寸、布局:

布局子檢視方法(在這個方法中,計算出三個子控制項的frame):

- (void)layoutsubviews

在計算時,indicator代表的是指示器,有三種,指示器的size都是固定的:

uiactivityindicatorview:系統自帶,預設size是

mbbarprogressview:預設是(.0f, .0f, 120.0f, 20.0f)

mbroundprogressview,預設是(0.f, 0.f, 37.f, 37.f)

totalsize:該方法根據hud的具體樣式計算出的frame,最後賦值給size,size就是中間的黑色區域

在drawrect方法中,系統對中心檢視進行了繪製:

- (void)drawrect:(cgrect)rect

利用圖形上下文繪製hud,首先判斷dimbackground是否為true來繪製dim背景,接著判斷color是否為true來設定hud的背景色

劃出hud的內容區域,根據計算出的frame

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...