[TOC]
一。UITableView+FDTemplateLayoutCell
- 介紹
第一個是讓我從復雜的tableviewcell布局中解放出來的一個category:UITableView-FDTemplateLayoutCell咆霜,我在上一篇文章中有提起:(iOS)使用auto layout進行復雜布局時,UILabel的相關trick
作者也很能寫阱州,上面的地址中有作者的文章鼓寺,介紹這個庫的使用方法勋拟。
- 閱讀和評論
- 使用block,將UITableViewDelegate最重要的兩個函數:
heightForRowAtIndexPath:
和cellForRowAtIndexPath:
給統一了
- 通過block讓用戶裝填cell的信息后妈候,使用系統提供的
systemLayoutSizeFittingSize:
計算出在實際的cell大懈颐摇(fd_heightForCellWithIdentifier
) - 對tableviewcel的加載進行了優(yōu)化,即在idle階段pre cache了cell height (
fd_precacheIfNeeded
)
贊苦银!
二啸胧。Shimmer
-
介紹
Shimmer是facebook在paper應用中采用的loading UI,該效果讓字體閃爍出銀色的光澤墓毒,很贊吓揪。
(圖片來自Shimmer在github上的主頁) 閱讀和評論
- Shimmer的效果由FBShimmeringMaskLayer : CAGradientLayer來實現,其opacity被漸變以顯現出底色所计,從而造成高亮的效果(
_updateMaskColors
&_updateMaskLayout
)
- 上面的mask的position被animate柠辞,從而造成閃動(高亮移動)的效果(
shimmer_slide_animation
)
贊~
三。XYPieChart
-
介紹
選用XYPieChart是因其小巧和華美的展開效果主胧。之前用core-plot叭首,感覺其結構的確非常好习勤,但是文檔過于粗糙。現在看中的ios-charts是由android移植而來焙格,看起來不錯图毕,但還未使用過。
不過我至今沒看到一個能在pie chart上比較好的顯示折線legend的庫眷唉。誰有推薦嗎予颤?自己雖然有寫一個,但是處理的極端情況還不夠全冬阳,也許有空可以發(fā)布出來看看蛤虐。
(圖片來自XYPieChart在github上的主頁) 閱讀和評論
- 每個pie slice都是一個layer(SliceLayer : CAShapeLayer),其展開動畫由startAngle和endAngle兩個double屬性決定
- 動畫效果的參數由
createArcAnimationForKey:
創(chuàng)建肝陪,startAngle和endAngle分開animate驳庭。CABasicAnimation按照用戶定義的動畫效果來更新startAngle和endAngle的值【注:由于startAngle和endAngle是用戶自定義的property,不是UIView內建的關聯了動畫效果的property氯窍,因此CABasicAnimation僅能animate這兩個property的數值饲常,此數值所對應的UI animation需要靠下一步來完成】 - CABasicAnimation delegate的
animationDidStart
中,創(chuàng)建用于展示UI animation的timer(updateTimerFired
)狼讨。timer中取得當前startAngle和endAngle的值【注:上述贝淤,此2數值被CABasicAnimation所animate了】,然后繪制出相應的pie slice
【第3步可以對比pop庫中的相應實現政供。pop中利用了CADisplaylink
的回調霹娄,實現了和屏幕刷新率相同動畫;而此處是自己創(chuàng)建的NSTimer鲫骗。感覺pop更優(yōu)〔染В】
贊~
四执泰。JLRoutes
介紹
通過App link,打開App后直接顯示某個特定內容或頁面渡蜻,是notification等圈留用戶方法的強需求术吝。JLRoute提供了解析App link,并回調block的機制茸苇,很好的實現了這個功能排苍。閱讀和評論
- API以class method的形式提供:
addRoute
注冊回調block,routeURL
解析app link
singleton(static
routeControllersMap
)保證數據的唯一性学密。routeControllersMap
管理app link scheme淘衙,每個scheme對應一個JLRoute類的實例。(若app僅注冊了一個app link腻暮,則僅維護一個global route)JLRoute類維護包含多個JLRoutes_的列表彤守,JLRoute_類則具體存放用戶注冊block及其相關參數(如priority等)毯侦。在用戶解析app link后,查找合適的block予以執(zhí)行
總結:
routeControllersMap(singleton) -> JLRoute(對應具體scheme) -> JLRoutes_(管理回調block)
五具垫。pop
-
介紹
iOS系統提供的UIView animation其實挺好用的侈离,配合CABasicAnimation對CALayer的動畫,大多數情況都盡夠用了筝蚕。選用pop卦碾,一來是因為其默認可以操作更多的UI property(比如color),二來也是其默認的彈簧效果實在配置得很賞心悅目起宽。
(圖片來自pop在github的頁面) 閱讀和評論
- 底層的動畫支持洲胖,使用了
CADisplayLink
,提供了和屏幕刷新率同頻的回調燎含,以保證動畫的順滑(見POPAnimator)
動畫曲線參數宾濒,保存在POPAnimation及其子類中,提供各式各樣的動畫效果
比如屏箍,動畫某個參數X時绘梦,在
CADisplayLink
的回調函數中,POPAnimation子類計算該參數X在當前幀的數值:POPAnimator的applyAnimationTime
赴魁,其中調用了定義在POPAnimationInternal.h中的關鍵函數:advanceTime
卸奉,而關于實際UI property的變化所引起的UI變化,則實現在updateAnimatable
中颖御。對于此lib所支持的可以動畫的UI property榄棵,系統定義了其pop_animatable_write_block
(見POPAnimatableProperty中的POPStaticAnimatablePropertyState),此預設block完成UI的改變潘拱。pop是用c++寫的喲
總結:
CADisplayLink
提供timer疹鳄,POPAnimation計算當前幀的數值,POPAnimatableProperty定義了該lib中所支持的UI property的block回調芦岂,從而完成整套動畫效果瘪弓。
六。reactiveCocoa (FRP / MVVM)
- 介紹
這東西值得花時間多寫一點禽最。
從方法上來看:
- 函數式編程(Functional programming)源遠流長腺怯,其思路是將計算理解成數學函數,即函數輸出僅與函數輸入有關川无。比較常用的函數有:map, reduce, filter等
- 響應式編程(Reactive programming)大約出現在Y2K呛占,其思路是將計算看作對連續(xù)數據流的響應。大體可以理解為事件驅動懦趋。
- 函數響應式編程(Functional reactive programming / FRP)采兩家之長晾虑。FRP應該是近期的一種思潮和趨勢吧,reactiveCocoa即是以FRP為理念的編程方法在cocoa(iOS)上的實現
從結構上來看:
- 大約Y2K的時候,大牛Martin Fowler構思了一種新的模型:Presentation Model走贪。其定義為:Represent the state and behavior of the presentation independently of the GUI controls used in the interface佛猛,即,將圖形控件的狀態(tài)和行為獨立出來作為一個新的組件坠狡。這種建模方式將圖形控件進一步分拆解耦继找,能有效降低“富圖形界面”的開發(fā)和測試難度。
- 后來微軟在開發(fā)WPF(Windows Presentation Foundation)時逃沿,參考了Presentation Model思路婴渡,提供了圖形控件(View)和其模型(ViewModel,即View的狀態(tài)和行為)間的邏輯支持凯亮。此結構被稱為MVVM(Model-View-ViewModel)边臼。
- 在iOS的開發(fā)中,xcode project默認采用的是MVC結構假消。但是隨著界面元素的豐富和邏輯的復雜柠并,view controller變得越來越臃腫。因此MVVM的思路被借鑒過來富拗,即對view controller進行分拆臼予,將view的狀態(tài)和行為拆至新的ViewModel中。整個程序的結構由原來的Model-ViewController-View啃沪,變成Model-ViewModel-ViewController-View
- reactiveCocoa可以提供View和ViewModel之間的DataBinding粘拾,從而方便的實現MVVM結構。
從歷史上來看:
微軟的The Reactive Extensions (Rx)是對.Net庫的響應式編程的擴充创千,提供了異步的缰雇、基于事件的編程實現。
也許是View和ViewModel之間的天然特性(事件表象與內在邏輯?)追驴,大家發(fā)現Rx與MVVM實乃天作之合械哟。
ReactiveCocoa是Rx在cocoa框架上的FRP實現。其為MVVM中的View和ViewModel間的邏輯提供了支持殿雪。
閱讀和評論
源代碼還沒看
七戒良。SDWebImage
- 介紹
大多數CS類型的app,都少不得要用到服務端的圖片冠摄,對于圖片的下載和加載,最大的需求有三:1. 異步下載几缭;2. 緩存圖片河泳;3. 優(yōu)化顯示。SDWebImage可以比較好的完成這幾個需求年栓,是比較常用的開源庫之一拆挥。
同時正因為這個庫的出名,已經有很多分析和介紹的文章了,比如:
SDWebImage庫結構的簡單分析
后面兩篇文章不能保證是原始鏈接纸兔,因為網上的轉載太多了惰瓜,并且都不帶轉載鏈接。而原作者似乎也并未對文章的原創(chuàng)性做更多的聲明汉矿。閱讀和評論
由于本庫較為出名崎坊,相關介紹和分析文章已經很多了,我也并不能寫不出什么新花樣洲拇。最最關鍵的是:源代碼既不多奈揍,也不長。因此有興趣的同學還是自己去看源代碼吧赋续。
呃男翰,畢竟讀了代碼,還是稍稍寫一點吧:按我在一纽乱。介紹中的說法蛾绎,用戶的最大需求有三:1. 異步下載;2. 緩存圖片鸦列;3. 優(yōu)化顯示
因此對應到代碼中:
- 接口類
SDWebImageManager
租冠,提供核心API。(其含有下面兩個類的實例)
-
SDWebImageDownloader
敛熬,完成需求1.異步下載 -
SDImageCache
肺稀,完成2. 緩存圖片 - 由UIImageView和UIButton的category,如
UIImageView+WebCache
应民,完成3. 優(yōu)化顯示
DONE
[TOC]