iOS中如何優雅的添加圓角和邊框?

  由於項目須要,整理了下圓角和邊框輔助類。想起前幾天標哥還在微博裏問圓角在tableView裏卡頓的問題,想着去炫耀下。去到標哥的博客,發現已經有必定程度解決給出開源庫而且在推廣,迭代了好幾個版本了。。git

  圓角這東西被無數性能追求者津津樂道,無數小白們高山仰止。 至於圓角的幾種實現方案,設置cornerRadius、加maskLayer、直接加鏤空圖、內存異步裁剪等等,網絡上一搜一大把,這裏就再也不重複了。這裏有兩點要提醒下,紋理裁剪纔是off-screen rendering的緣由,而不是設置圓角。固然你要是做死的去設了layer的fillColor,再來設圓角,那就只能說no zuo no die ;另外在使用光柵化時,必定要設置scale以適配屏幕分辨率。github

  既然標哥都給出開源方案了,那就比較一下,檢查下本身的不足吧。爲參照相同的運行條件,筆者把本身寫的輔助類放到標哥的Demo裏,實現相同的效果。而後設計思路、外觀呈現、CPU和內存、幀速、代碼量、侵入性和易用性、適用場景等個方面作出比較。緩存

  標哥的開源庫:https://github.com/CoderJackyHuang/HYBImageCliped網絡

  筆者fork後修改的項目:https://github.com/1962449521/HYBImageCliped異步

  該功能類的在線維護:https://github.com/1962449521/WHUCornerMaker性能

  筆者整理中的輔助類集:https://github.com/1962449521/WHUKit/tree/master/WHUKitDemo/WHUKitDemo/WHUKit優化

 

  如下爲筆者方案標哥開源庫的比較編碼

  1、 突破口的選擇spa

  標哥選擇的起點是內存中剪裁圖片,經過緩存策略優化性能,給UIView、UIImageView、UIButton等控件增長Category以擴展功能。筆者選擇的起點是繪製鏤空圖,一樣使用了緩存以提升複用。由於長期開發SDK儘可能不使用Category的習慣,筆者採用輔助類的形式提供功能實現設計

  2、 功能及解決問題

  主要的出發點都是爲了解決圓角圖片離屏渲染影響滑動幀速的問題。標哥採用了剪裁圖片的方式,可以適應背景非單色狀況;在控件內部的圖片,能提供圓角效果,好比按鈕內非抵邊的image;在邊線的繪製上,提供了形狀邊框,邊框有填充和邊線。筆者提供的輔助類只適用背景單色,裁剪針對UIView或其子類總體,邊線只提供單線。

  3、 外觀呈現

   除了雙色邊線外,其它的外觀都能作到相同的效果。

標哥靜態容器 筆者靜態容器
標哥collectionView 筆者collectionView

  

  4、CPU和內存  

  標哥方案CPU使用驟增,最高達到82%。內存使用也高於筆者。由於筆者採用了每次cell出現時重繪邊角,因此CPU略高。若是肯定每次cell重用時邊角位置正確,能夠不重繪邊角,CPU能穩定在13%左右。圖片相對較少,內存使用差異不明顯。當不一樣圖片較多時,標哥使用方案需大量緩存裁切好的圖片,猜想會在內存使用上隨之增長。而筆者方案會複用相同角度顏色的邊角,圖片增多時不會增長圓角圖片的內存開銷。

標哥方案
筆者方案

  

  5、 幀速

  滑動幀速基本相近,都有較好的體驗,筆者方案數值相對較高。

標哥方案
筆者方案

    6、代碼量

  標哥使用了一個管理類HYBImageClipedManager,以及提供了UIImage、UIView、UIButton三個類的category,總共約1千行代碼。筆者提供了WHUCornerMaker、WHUBorderMaker兩個輔助功能類,約250行代碼。

    7、侵入性和易用性

  如下爲筆者兩個輔助類的頭文件聲明和暴露的使用API,自認爲仍是較爲清晰易用的。這裏要說到關於註釋,多餘的註釋是違反DRY原則的,不過因爲國人對英文的理解不直接或者項目編碼約定,而加了許多沒必要要的註釋。仍是應當以清晰符合語義的方法、變量命名做爲首選。至於標哥提供的接入設計,方法太多就不在這裏列出了,感興趣的童鞋能夠從本文提供的連接跳入查看^^

@interface WHUCornerMaker : NSObject

+ (BOOL) isCorneredAtView:(UIView * _Nonnull)view;

// 優先選取view 沿superview上的父類容器的背景色, 若是一直爲nil, 則取defaultColor 做爲圓角顏色

- (void) roundView:( UIView * _Nonnull ) view withCornerRadius:(CGFloat) radius defaultColor:( UIColor * _Nullable)color;

- (void) roundViews:(NSArray<UIView *> * _Nonnull) views withCornerRadius:(CGFloat) radius  defaultColor:( UIColor * _Nullable)color;

- (void) roundView:(UIView * _Nonnull) view withCornerRadius:(CGFloat) radius defaultColor:( UIColor * _Nullable)color byRoundingCorners:(UIRectCorner)corners;

- (void) roundViews:(NSArray<UIView *> * _Nonnull) views withCornerRadius:(CGFloat) radius  defaultColor:( UIColor * _Nullable)color  byRoundingCorners:(UIRectCorner)corners;


@end
@interface WHUBorderMaker : NSObject

+ (void) borderView:( UIView * _Nonnull ) view withCornerRadius:(CGFloat) radius width:(CGFloat)borderWidth color:(UIColor * _Nonnull)borderColor;


+ (void) borderView:( UIView * _Nonnull ) view withCornerRadius:(CGFloat) radius width:(CGFloat)borderWidth color:(UIColor * _Nonnull)borderColor byRoundingCorners:(UIRectCorner)corners;

@end

 

     8、適用場景

  不能否認,標哥提供了更多功能,好比拿到裁切的圖片,繪製雙色邊框等。不過這樣的使用場景應該是較少的,筆者提供了輔助類能知足大多數場景的需求。

 

     9、總結

在作通用性開源庫的時候,可能會考慮更多的東西。但花80%的精力去實現5%使用者的需求是否有必要是有待斟酌的。在筆者方案和標哥方案的比較中,整體而言筆者的方案性能是高出不少,並不隨使用條件複雜性的增長而性能下降。這一方面是內存裁剪圖片本就是騎虎難下的選擇,一方面也是筆者只針對有限的使用場景和需求。

相關文章
相關標籤/搜索