筆記-圓角四種方法的對比以及性能檢測

這篇文章是繼筆記-iOS設(shè)置圓角方法以及指定位置設(shè)圓角文章而寫的税肪,因為上篇文章發(fā)出來后讲坎,沒有驗證关筒,也有同行的朋友讓我給出一些測試數(shù)據(jù)來證實一下,所以這里就給出一下我個人的一些測試數(shù)據(jù)驶睦,正確是否腻格,還請大家作為參考。--------另外啥繁,我寫這個僅僅只是自己作為筆記使用菜职,原來都是放在草稿里的,但是手機版的無法查看草稿旗闽,所以就發(fā)出來酬核,沒有想過會有人來看,所以如果有錯誤的內(nèi)容誤導(dǎo)了大家請原諒适室,也請發(fā)現(xiàn)錯誤的猿友及時幫忙提出嫡意,謝謝大家。

Core Animation工具檢測離屏渲染

對離屏渲染的檢測捣辆,蘋果為我們提供了一個測試工具Core Animation蔬螟。可以在Xcode->Open Develeper Tools->Instruments中找到汽畴。

先看看第一種方式:通過設(shè)置layer的屬性

對UIImageview設(shè)置:

image.png

結(jié)果: 無離屏渲染

滾動的幀率:

image.png

結(jié)果: 接近60旧巾,趨于穩(wěn)定

對UIButton設(shè)置:

image.png

結(jié)果: 離屏渲染

滾動的幀率:

image.png

如果低于40幀每秒,普通用戶就會察覺明顯的不流暢忍些,現(xiàn)在這樣app進入垃圾級別體驗了鲁猩。

對于文本視圖實現(xiàn)圓角(UILabel, UIView, UITextField, UITextView

均只進行cornerRadius設(shè)置,不進行masksToBounds的設(shè)置

離屏渲染情況:

image.png

從上圖可以看出罢坝,對于UILabel, UIView, UITextField來說廓握,實現(xiàn)了圓角的設(shè)置,并沒有產(chǎn)生離屏渲染嘁酿;而對于UITextView隙券,產(chǎn)生了離屏渲染。

滾動的幀率:
不存在UITextView視圖的情況下

image.png

存在UITextView視圖的情況下

image.png

官方對離屏渲染產(chǎn)生性能問題也進行了優(yōu)化:

iOS9.0之前UIImageView跟UIButton設(shè)置圓角都會觸發(fā)離屏渲染闹司。

iOS9.0之后UIButton設(shè)置圓角會觸發(fā)離屏渲染娱仔,而UIImageView設(shè)置圓角不會觸發(fā)離屏渲染了,但是如果設(shè)置其他陰影效果之類的還是會觸發(fā)離屏渲染

第二種方式:使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角

對UIImageview設(shè)置:
幀率結(jié)果:

image.png

對UIButton設(shè)置:
幀率結(jié)果:

image.png

兩種設(shè)置均是無離屏渲染

第三種方式:使用Core Graphics框架畫出一個圓角

對UIImageview設(shè)置:
幀率結(jié)果:

image.png

對UIButton設(shè)置:
幀率結(jié)果:

image.png

兩種設(shè)置均是無離屏渲染

第四種方式:使用CAShapeLayer和UIBezierPath設(shè)置圓角

對UIImageview开仰、UIButton設(shè)置:
幀率結(jié)果:

8D1E59C9-800B-4C24-8F0D-27885972D683.png

兩種都是離屏渲染拟枚,掉幀更加嚴重薪铜≈诠基本上不能使用恩溅。

由上述測試可以知道,我上篇文章里所記筆記是有問題的谓娃。這里的測試結(jié)果可以看的徹底脚乡。

新方法:實際可采取利用

混合圖層

在需要裁剪的視圖上面添加一層視圖,以達到圓角的效果滨达。效果如下:

image.png

布局圖如下:


image.png

對于UIImageViewUIButton均可使用奶稠,且無離屏渲染

滾動的幀率:


image.png

代碼如下:

- (void)drawRoundedCornerImage {
    UIImageView *iconImgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    iconImgV.image = [UIImage imageNamed:@"icon"];
    [self.view addSubview:iconImgV];
    
    [iconImgV mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(iconImgV.size);
        make.top.equalTo(self.view.mas_top).offset(500);
        make.centerX.equalTo(self.view);
    }];
    
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    [self.view addSubview:imgView];
    
    [imgView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(imgView.size);
        make.top.equalTo(iconImgV.mas_top);
        make.leading.equalTo(iconImgV.mas_leading);
    }];
    
    // 圓形
    imgView.image = [self drawCircleRadius:100 outerSize:CGSizeMake(200, 200) fillColor:[UIColor whiteColor]];
}

// 繪制圓形
- (UIImage *)drawCircleRadius:(float)radius outerSize:(CGSize)outerSize fillColor:(UIColor *)fillColor {
    UIGraphicsBeginImageContextWithOptions(outerSize, false, [UIScreen mainScreen].scale);
    
    // 1、獲取當前上下文
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    
    //2.描述路徑
    // ArcCenter:中心點 radius:半徑 startAngle起始角度 endAngle結(jié)束角度 clockwise:是否逆時針
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(outerSize.width * 0.5, outerSize.height * 0.5) radius:radius startAngle:0 endAngle:M_PI * 2 clockwise:NO];
    [bezierPath closePath];
    
    // 3.外邊
    [bezierPath moveToPoint:CGPointMake(0, 0)];
    [bezierPath addLineToPoint:CGPointMake(outerSize.width, 0)];
    [bezierPath addLineToPoint:CGPointMake(outerSize.width, outerSize.height)];
    [bezierPath addLineToPoint:CGPointMake(0, outerSize.height)];
    [bezierPath addLineToPoint:CGPointMake(0, 0)];
    [bezierPath closePath];
    
    //4.設(shè)置顏色
    [fillColor setFill];
    [bezierPath fill];
    
    CGContextDrawPath(contextRef, kCGPathStroke);
    UIImage *antiRoundedCornerImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return antiRoundedCornerImage;
}

此方法就是在要添加的視圖上在疊加一個部分透明的視圖捡遍,只對圓角部分進行遮擋锌订。圖層混合的透明度處理方式與mask正好相反。
此方法沒有離屏渲染画株,也可以自定義設(shè)置指定任意角為圓角辆飘。

總結(jié)

  • 在可以使用混合圖層遮擋的場景下,優(yōu)先使用谓传。
  • 通過.layer屬性設(shè)置蜈项,綜合性能上,還是有很大優(yōu)勢的续挟。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紧卒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诗祸,更是在濱河造成了極大的恐慌跑芳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件直颅,死亡現(xiàn)場離奇詭異聋亡,居然都是意外死亡,警方通過查閱死者的電腦和手機际乘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門坡倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脖含,你說我怎么就攤上這事罪塔。” “怎么了养葵?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵征堪,是天一觀的道長。 經(jīng)常有香客問我关拒,道長佃蚜,這世上最難降的妖魔是什么庸娱? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮谐算,結(jié)果婚禮上熟尉,老公的妹妹穿的比我還像新娘。我一直安慰自己洲脂,他們只是感情好斤儿,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恐锦,像睡著了一般往果。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上一铅,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天陕贮,我揣著相機與錄音,去河邊找鬼潘飘。 笑死肮之,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的福也。 我是一名探鬼主播局骤,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暴凑!你這毒婦竟也來了峦甩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤现喳,失蹤者是張志新(化名)和其女友劉穎凯傲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦篱,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡冰单,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灸促。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诫欠。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浴栽,靈堂內(nèi)的尸體忽然破棺而出荒叼,到底是詐尸還是另有隱情,我是刑警寧澤典鸡,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布被廓,位于F島的核電站,受9級特大地震影響萝玷,放射性物質(zhì)發(fā)生泄漏嫁乘。R本人自食惡果不足惜昆婿,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓斧。 院中可真熱鬧仓蛆,春花似錦、人聲如沸法精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搂蜓。三九已至,卻和暖如春辽装,著一層夾襖步出監(jiān)牢的瞬間帮碰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工拾积, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殉挽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓拓巧,卻偏偏與公主長得像斯碌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肛度,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容