iOS Color Misaligned Images優(yōu)化

最近在做GPU圖層顯示的優(yōu)化,其中關(guān)于Color Misaligned Images優(yōu)化文章有很多乐设,但在具體優(yōu)化的時(shí)候還是遇到了點(diǎn)的問題,特此記錄绎巨。

檢測方式

以下兩種方式均可發(fā)現(xiàn)存在Misaligned Images問題的地方:

  • 模擬器調(diào)試時(shí)近尚,打開模擬器的Debug - Color Misaligned Images菜單選項(xiàng)。最快捷场勤,但僅限模擬器上查看戈锻。
  • Instrument性能檢測時(shí),選中Core Animation模板和媳,在Display Settings中勾選Color Misaligned Images選項(xiàng)格遭。可針對模擬器和真機(jī)留瞳,可查看真機(jī)上所有應(yīng)用的像素混合情況拒迅。

問題定義

打開開關(guān)后,看到部分視圖會有黃色或洋紅色(Magenta)的圖層標(biāo)記,代表其像素不對齊璧微。
不對齊:視圖或圖片的點(diǎn)數(shù)(point)作箍,不能換算成整數(shù)的像素值(pixel),導(dǎo)致顯示視圖的時(shí)候需要對沒對齊的邊緣進(jìn)行額外混合計(jì)算前硫,影響性能胞得。
洋紅色:UIView的frame像素不對齊,即不能換算成整數(shù)像素值屹电。
黃色:UIImageView的圖片像素大小與其frame.size不對齊阶剑,圖片發(fā)生了縮放造成。

優(yōu)化方式

frame像素不對齊


針對frame像素不對齊危号,借助ceilf()牧愁、floorf()、CGRectIntegral()等將小數(shù)點(diǎn)后數(shù)據(jù)除去即可葱色。
使用floorf時(shí)递宅,需要注意是否會因?yàn)橄蛳氯≌绊懸晥D的顯示。
關(guān)于CGRectIntegral的使用苍狰,《Aligned UIViews》這篇文章中提到一種非常特殊的情況办龄,在layoutSubviews中使用CGRectIntegral來重新設(shè)置frame,可能導(dǎo)致同一個(gè)view在不同時(shí)候計(jì)算得到到的x和width不同的情況淋昭,但實(shí)際測試并沒有發(fā)現(xiàn)文章中描述的問題俐填。
0.5個(gè)點(diǎn),會造成像素不對齊嗎翔忽?
在@2x屏幕上不會英融,但@3x屏幕上會。會不會由最終計(jì)算得像素值是不是整數(shù)判斷歇式,比如上圖中在@3x屏幕上驶悟,第4個(gè)label高度為40.1導(dǎo)致了像素不對齊,但第3個(gè)label高度為40+1/3沒導(dǎo)致像素不對齊材失,在@2x屏幕上當(dāng)然這兩個(gè)寬度都會導(dǎo)致像素不對齊痕鳍。

像素不對稱齊的元素一般為UILabel或UIImageView。
特別注意龙巨,上圖中UILabel寬度不為整數(shù)時(shí)并沒有有像素不對齊笼呆,但x、y旨别、height不為整數(shù)就會導(dǎo)致像素不對齊诗赌。

圖片像素不對齊


上圖的前4個(gè)UIImageView,顯示的是同一張圖片秸弛,該圖片@2x像素為128x128px铭若,@3x像素為192x192px洪碳,僅當(dāng)UIImageView的size為64x64的時(shí)候才沒有像素不對齊。
遇到這種情況需要嚴(yán)格約束Icon圖片和UIImageView的尺寸奥喻。

還有種情況即圖片是從服務(wù)端獲取到的偶宫,大小不規(guī)則。直接在UIImageView上顯示容易出現(xiàn)像素不對齊环鲤。
解決方法:將下載到的圖片纯趋,縮放到與UIImageView對應(yīng)的尺寸,再顯示出來冷离。
多種圖片縮放方式及其性能比較可參考《Image Resizing Techniques》吵冒,此處提供一個(gè)簡單實(shí)現(xiàn):

@implementation UIImage(Resize)

/**
 將UIImage縮放到指定大小

 @param boxSize 一般為UIImageView的size
 @return 縮放后的UIImage
 */
- (UIImage *)imageShowInSize:(CGSize)boxSize {
    if (CGSizeEqualToSize(boxSize, self.size)) {
        return self;
    }
    
    CGFloat screenScale = [[UIScreen mainScreen] scale];
    CGFloat rate = MAX(boxSize.width / self.size.width, boxSize.height / self.size.height);
    CGSize resize = CGSizeMake(self.size.width * rate , self.size.height * rate );
    CGRect drawRect = CGRectMake(-(resize.width - boxSize.width) / 2.0 ,
                                 -(resize.height - boxSize.height) / 2.0 ,
                                 resize.width,
                                 resize .height);
    boxSize = CGSizeMake(boxSize.width, boxSize.height);
    UIGraphicsBeginImageContextWithOptions(boxSize, YES, screenScale);
    [self drawInRect:drawRect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
@end

注意

  • 具體使用時(shí),可能需要根據(jù)UIImageView的contentMode屬性調(diào)整縮放方式西剥。
  • 該方法執(zhí)行會花費(fèi)一定的時(shí)間痹栖,在列表上顯示需要縮放的圖片,為了不影響列表滾動流程體驗(yàn)瞭空,該操作應(yīng)放到非主線進(jìn)行揪阿,并考慮將縮放后的結(jié)果緩存以便下次直接使用。
  • 根據(jù)原始圖片尺寸大小咆畏,當(dāng)前狀況是否明顯影響列表滾動等具體情況再決定是否優(yōu)化南捂,比如目前微博首頁的用戶頭像和九宮格圖片不存在像素不對齊情況,而微信朋友圈的用戶頭像和圖片是染成黃色的像素不對齊旧找。

UITableview上UILabel的不對齊


在某些UITableview上溺健,會發(fā)現(xiàn)盡管UILabel的frame已經(jīng)取整了,但所有Cell上Label還是全都被染成了紅色钮蛛,非常不解鞭缭。

打開Xcode的Debug View Hierarchy,可以看到進(jìn)入頁面UITableview還沒做任何滾動時(shí)魏颓,UILabel的frame沒有異常岭辣,但是UITableViewCell的y坐標(biāo)不是整數(shù),有個(gè)0.01的差值甸饱。

這次恍然大悟易结,父視圖的像素不對齊也會影響到子視圖。而此處0.01差值的來源柜候,是UITableview的header高度。
在使用Group Style的UITableview時(shí)躏精,如果tableView:heightForHeaderInSection:回調(diào)返回0渣刷,系統(tǒng)會認(rèn)為沒有設(shè)置header的高度而重新提供一個(gè)默認(rèn)的header高度,導(dǎo)致在UITableview中看到一個(gè)空白的header矗烛。
一種簡單但有隱患的處理方式辅柴,就是在回調(diào)里返回一個(gè)很小的高度箩溃,比如0.1、0.01碌嘀,這樣能達(dá)到隱藏header的效果涣旨,但也造成了此處的像素不對齊問題。
解決方法

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

避免使用0.01這樣的具體數(shù)值(0.01還不足夠小股冗,0.0001就能避免此處的不對齊)霹陡,直接使用系統(tǒng)給的CGFLOAT_MIN,這個(gè)足夠小的值既能避免上述情況止状,又能讓代碼更直觀烹棉。
隱藏header的其它方法和原理可參考:0代碼隱藏GroupedTableView上邊多余的間隔

參考文章:

我的博客原址:iOS Color Misaligned Images優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怯疤,一起剝皮案震驚了整個(gè)濱河市浆洗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌集峦,老刑警劉巖伏社,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塔淤,居然都是意外死亡摘昌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門凯沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第焰,“玉大人,你說我怎么就攤上這事妨马⊥伲” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵烘跺,是天一觀的道長湘纵。 經(jīng)常有香客問我,道長滤淳,這世上最難降的妖魔是什么梧喷? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脖咐,結(jié)果婚禮上铺敌,老公的妹妹穿的比我還像新娘。我一直安慰自己屁擅,他們只是感情好偿凭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派歌,像睡著了一般弯囊。 火紅的嫁衣襯著肌膚如雪痰哨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天匾嘱,我揣著相機(jī)與錄音斤斧,去河邊找鬼。 笑死霎烙,一個(gè)胖子當(dāng)著我的面吹牛撬讽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吼过,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼锐秦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盗忱?” 一聲冷哼從身側(cè)響起酱床,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趟佃,沒想到半個(gè)月后扇谣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闲昭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年罐寨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序矩。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸯绿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出簸淀,到底是詐尸還是另有隱情瓶蝴,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布租幕,位于F島的核電站舷手,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劲绪。R本人自食惡果不足惜男窟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贾富。 院中可真熱鬧歉眷,春花似錦、人聲如沸颤枪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇鞭。三九已至凉唐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霍骄,已是汗流浹背台囱。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留读整,地道東北人簿训。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像米间,于是被迫代替她去往敵國和親强品。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫屈糊、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • [這是第1篇] 導(dǎo)語:像素對齊并不是一個(gè)復(fù)雜的問題逻锐,但是開發(fā)中稍不注意的話夫晌,是會造成像素不對齊的情況(恰恰容易被忽...
    南華coder閱讀 10,059評論 10 85
  • 時(shí)刻保持自己的關(guān)系,不停尋找動力昧诱,讓自己變得更加多元化晓淀,別讓希望變成絕望。
    姜楊A(yù)da閱讀 183評論 0 0
  • 什么叫做“念”盏档?“念”就是人的心念凶掰,就是人腦海里不斷跳過,不斷幻化的各種想法蜈亩。當(dāng)你嘗試打坐懦窘,嘗試讓自己平靜下來的時(shí)...
    alabiubiubiu閱讀 227評論 0 1
  • 促銷:站著無聊奶赠。但是穩(wěn)定拿錢。 督導(dǎo):可以動換药有。但是活少錢少毅戈。時(shí)間寬裕》叨瑁可以做別的事苇经。(還沒定下來。) 禮儀:還沒...
    夏之兔耳閱讀 65評論 0 0