2016.7.30設(shè)計LTWebViewLayout高度自適應(yīng)緩存框架

前言

筆記:思維設(shè)計圖,方法調(diào)用棧暫時先擱置,先補(bǔ)補(bǔ)校招知識

參考資料

蘋果開發(fā)者文檔

UITableViewCell自適應(yīng)高度框架

作者博客

設(shè)計思路

設(shè)計總圖
布局子圖
根據(jù)key(鍵)來區(qū)別每個UIWebView高度
UIWebView代理方法
UIWebView橫屏豎屏數(shù)組
LTWebViewLayout(高度布局)主要方法

技術(shù)點(diǎn)

  • Category Use Method Swizzling
  • Category AssociatedObject
  • systemLayoutSizeFittingSize And sizeThatFits

Category Use Method Swizzling

1.類中調(diào)用+load方法和-category中調(diào)用和+load方法調(diào)用順序是怎樣(類和分類同時重寫load方法)?
答:+load的執(zhí)行順序是先類,后category,而category的+load執(zhí)行順序是根據(jù)編譯順序決定的。

**2.類和-category中調(diào)用和+load方法調(diào)用順序是怎樣(只有分類重寫load方法)? **
答:先調(diào)用category +load方法,后類

  • 在Objective-C實(shí)現(xiàn)擴(kuò)展方法可以使用Category來覆蓋系統(tǒng)方法,當(dāng)系統(tǒng)方法被覆蓋后,系統(tǒng)會優(yōu)先調(diào)用Category中的代碼,然后在調(diào)用原類中的代碼,如果我們在已有的Category想實(shí)現(xiàn)UIWebViewDelegate代理方法,往往就會使用Method Swizzling,可以通過新建UIWebView Category,在其分類使用+(load)Method Swizzling替換代理方法為自己構(gòu)造的方法(構(gòu)造的方法內(nèi)部計算UIWebView 高度并緩存高度),再執(zhí)行項(xiàng)目當(dāng)中UIWebViewDelegate代理方法

深入理解Category

Category AssociatedObject

1.在category里面如何添加實(shí)例變量的? 
答:在category里面是無法為category添加實(shí)例變量的。但是我們很多時候需要在category中添加和對象關(guān)聯(lián)的值,這個時候可以求助關(guān)聯(lián)對象來實(shí)現(xiàn)。

2.但是關(guān)聯(lián)對象又是存在什么地方呢? 如何存儲? 對象銷毀時候如何處理關(guān)聯(lián)對象呢?
關(guān)聯(lián)對象又是存在什么地方:AssociationsManager里面是由一個靜態(tài)AssociationsHashMap來存儲所有的關(guān)聯(lián)對象的。

如何存儲:所有對象的關(guān)聯(lián)對象都存在一個全局map里面。而map的的key是這個對象的指針地址(任意兩個不同對象的指針地址一定是不同的),而這個map的value又是另外一個AssociationsHashMap,里面保存了關(guān)聯(lián)對象的kv對。

對象銷毀時候如何處理關(guān)聯(lián)對象:runtime的銷毀對象函數(shù)objc_destructInstance里面會判斷這個對象有沒有關(guān)聯(lián)對象,如果有,會調(diào)用_object_remove_assocations做關(guān)聯(lián)對象的清理工作。

systemLayoutSizeFittingSize And sizeThatFits

  • LT_systemFittingHeightForConfiguratedWebView:該方法提供了兩套計算高度方式,分別是框架布局和自動布局

  • 當(dāng)enforceFrameLayout為NO時使用自動布局自動布局的步驟:

(1)在計算高度前向 contentView 加了一條和 webView 寬度相同的寬度約束,強(qiáng)行讓 contentView 內(nèi)部的控件知道了自己父 view 的寬度,再反算自己被外界約束的寬度(給contentView添加約束)
(2)調(diào)用systemLayoutSizeFittingSize api為contentView自適應(yīng)高度
(3)移出contentView約束框架布局

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

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

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