久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

iOS圖片圓角優(yōu)化

 sungkmile 2016-04-20

本文為投稿文章,,作者:@olinone_龐海礁Github

最近,,關(guān)于圖片圓角的話題討論非常激烈,出現(xiàn)了許多好的文章,。恰逢工作需要,,用到了大量圓角圖片。然而,,系統(tǒng)圓角會導(dǎo)致離屏渲染的問題,,出于性能考慮,于是有了圖片圓角渲染工具HJCornerRadius,,其最大優(yōu)勢在于使用簡單,,一行搞定圖片圓角

1
imageview.aliCornerRadius = 5.0f;

核心思想就是使用圓角圖片替換系統(tǒng)圓角。實(shí)際使用時,,確保layer對象的masksToBounds屬性為NO

1
imageview.layer.masksToBounds = NO

支持pod方式安裝,,如果你在實(shí)際使用中遇到什么問題,歡迎在文章后面跟我留言

1
pod 'HJCornerRadius', :git => "

當(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)象

具體截圖渲染代碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UIGraphicsBeginImageContextWithOptions(self.originImageView.bounds.size, NO, [UIScreen mainScreen].scale);
    CGContextRef currnetContext = UIGraphicsGetCurrentContext();
    CGContextAddPath(currnetContext, [UIBezierPath bezierPathWithRoundedRect:self.originImageView.bounds cornerRadius:self.cornerRadius].CGPath);
    CGContextClip(currnetContext);
    [self.originImageView.layer renderInContext:currnetContext];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
     
    if ([image isKindOfClass:[UIImage class]]) {
        image.aliCornerRadius = YES;
        self.originImageView.image = image;
    else {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateImageView];
        });
    }

經(jīng)過實(shí)際測試驗(yàn)證,,效果還是比較理想的,,即使需要顯示大量圓角圖片,,顯示幀數(shù)也可以穩(wěn)定在50幀以上。CPU消耗影響較小,,以iPhone6測試顯示,,CPU實(shí)際消耗上漲不會超過5%,屬于合理范圍之內(nèi),。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多