本文為投稿文章,,作者:@olinone_龐海礁(Github) 最近,,關(guān)于圖片圓角的話題討論非常激烈,出現(xiàn)了許多好的文章,。恰逢工作需要,,用到了大量圓角圖片。然而,,系統(tǒng)圓角會導(dǎo)致離屏渲染的問題,,出于性能考慮,于是有了圖片圓角渲染工具HJCornerRadius,,其最大優(yōu)勢在于使用簡單,,一行搞定圖片圓角
核心思想就是使用圓角圖片替換系統(tǒng)圓角。實(shí)際使用時,,確保layer對象的masksToBounds屬性為NO
支持pod方式安裝,,如果你在實(shí)際使用中遇到什么問題,歡迎在文章后面跟我留言 當(dāng)然,本文的目的不是介紹如何使用該工具,,而是想跟大家分享開發(fā)時用到的幾點(diǎn)設(shè)計(jì)思想 自觀察的巧妙應(yīng)用 既然要生成圓角圖片,,首先要解決生成時機(jī)問題??赡軙信笥严氲絪wizzle類UIImageView的setImage方法,,但我個人并不推薦,畢竟Swizzle類方法影響范圍太廣,,對于大型開發(fā)團(tuán)隊(duì),,出問題后很難排查定位問題所在。定義UIImageView子類,?實(shí)用性不強(qiáng),! 還記得我在文章《“自釋放”在iOS開發(fā)中的應(yīng)用》 中提到的實(shí)現(xiàn)自釋放的三種方式嗎?其中一種方式就是動態(tài)屬性觀察者——通過創(chuàng)建一個動態(tài)屬性KVO被觀察對象的某一屬性,,從而達(dá)到自監(jiān)控的目的,。 通過創(chuàng)建動態(tài)屬性觀察者HJImageObserver,監(jiān)聽UIImageView的image屬性,,當(dāng)image發(fā)生變化時,,能夠立即觸發(fā)圓角圖片的生成,從而達(dá)到自動實(shí)現(xiàn)圓角圖片替換的目的,,具體實(shí)現(xiàn)可以參考源碼 HJCornerRadius,。 RunLoop的適當(dāng)切換 細(xì)心的朋友可能注意到,本工具并不是直接渲染原始Image對象,,而是先截取UIImageView視圖Layer生成的Image,,然后再做渲染。原因很簡單,,因?yàn)閁IImageView呈現(xiàn)方式涉及多種ContentMode,,通過渲染UIImageView視圖Layer生成的圖片可以巧妙的解決UIImageView顯示模式的問題 此外,由于系統(tǒng)原因,,對于像UITableViewCell的UIImageView,,第一次創(chuàng)建賦圖時,可能無法獲取UIImageView視圖Layer的圖片,,此時,,可以通過切換異步RunLoop達(dá)到延時渲染的目的 眾所周知,截圖渲染的邏輯是可以運(yùn)行在工作線程,,但是本工具并沒有把它們放在工作線程執(zhí)行,,因?yàn)榉旁诠ぷ骶€程會有延遲,從而導(dǎo)致圖片閃爍的現(xiàn)象 具體截圖渲染代碼如下
經(jīng)過實(shí)際測試驗(yàn)證,,效果還是比較理想的,,即使需要顯示大量圓角圖片,,顯示幀數(shù)也可以穩(wěn)定在50幀以上。CPU消耗影響較小,,以iPhone6測試顯示,,CPU實(shí)際消耗上漲不會超過5%,屬于合理范圍之內(nèi),。 |
|