1 image的圓角問題
老問題,出現(xiàn)問題的根源在圓角效果可能帶來的離屏渲染辐马。
a. 圓角圖片拷橘。
b. 子線程做圓角裁剪,同理還是圓角圖片喜爷。
c. 添加一個中空的圓角遮罩層冗疮。
d.使用 Core Graphics 重新繪制帶圓角的圖片。
*d*
CGRect rect = (CGRect){0.f,0.f,size};
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[strongSelf drawInRect:rect];
UIImage *output =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
2 UIImage加載圖片
????基本流程:加載-->解碼-->繪制檩帐。通常加載圖片時IOS通常會延遲解碼圖片赌厅。
????原生方法中最好使用imageNamed: 方法--加載圖片后立即解壓,不影響圖片的繪制轿塔。但是此方法只對于應(yīng)用中的資源圖片有效特愿,對于用戶生成或者下載的圖片來說是無效的。我們可以考慮繞開UIKit來加載圖片勾缭。
NSInteger index = indexPath.row
NSURL *imageURL = [NSURL fileURLWithPath:imagePath];
NSDictionary *options = @{(__bridge id)kCGImageSourceShouldCache:YES};
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL,NULL);
CGImageRef imageRef =CGImageSourceCreateImageAtIndex(source,0,(__bridge CFDictionary)options);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CFRelease(source)
3 像素不對齊&image和容器大小不一致
????出現(xiàn)像素不對齊的情況揍障,會導(dǎo)致在GPU渲染時,對沒對齊的邊緣俩由,需要進行插值計算毒嫡,這個插值計算的過程會有性能損耗。
像素不對齊: 邏輯像素(point)乘以2(2x的視網(wǎng)膜屏) 或3(3x的視網(wǎng)膜屏)得到的物理像素為 整數(shù)值幻梯,或者說得到的浮點數(shù)且小數(shù)點后都是0的兜畸,這就像素對齊了,否則就是像素不對齊碘梢。
邏輯像素(point)與物理像素(pixel):通常我們UI標注和app里面視圖大小為邏輯像素咬摇。不同機型顯示屏1point對應(yīng)2x或3x的物理像素。圖片渲染前會將point換算為pixel煞躬。
????當圖片與圖片容器像素大小不一致時同樣會造成不必要的損耗肛鹏。
查找不對齊像素:模擬器中勾選Debug -->Color Misaligned Images選項逸邦,當UIView(及其子類)的frame像素不對齊顯示洋紅色;當圖片的像素大小與控件的大小不一致而導(dǎo)致需要縮放時在扰,顯示黃色缕减。
1、frame設(shè)置時候芒珠,使用整數(shù); 需要計算frame時候桥狡,計算的結(jié)果使用ceil處理一下,避免小數(shù)點后有非0數(shù)存在皱卓。UITableViewCell的高度的高度是整數(shù)裹芝。
2、項目中好爬,要求UI設(shè)計師提供@2x和@3x的切圖。
3甥啄、設(shè)置imageView的size要和切圖的size(邏輯像素(point))相等存炮。
4、網(wǎng)絡(luò)上獲取的圖片的size要縮放和imageView的size(邏輯像素(point))要相等蜈漓,縮放后的圖片的scale和[UIScreen mainScreen].scale要相等穆桂。
5、縮放這樣的耗時操作應(yīng)該放到子線程去做融虽。最好做緩存享完,避免每次顯示都需要縮放操作。
4像素混合
????iPhone模擬器中勾選 Debug ->Color Blended Layers選項 可以將像素混合的部分顯示出來有额。發(fā)生了像素混合的區(qū)域顯示紅色般又,正常則顯示綠色
像素混合: 是指在某視圖為透明背景色,GPU在渲染視圖時巍佑,需要將該視圖和下層視圖混合(Blend)后才能計算出該像素點的實際顏色茴迁;這增加了GPU的工作,損耗了性能萤衰。
5 view設(shè)置圖片
UIImage *image = [UIImage imageNamed:@"playing"];
view.layer.contents = (__bridge id)image.CGImage;
//設(shè)置顯示的圖片范圍(0~1)
view.layer.contentsCenter = CGRectMake(0.25, 0.25, 0.5, 0.5);