我在使用paintCode的過程中遇到一些小坑,這裡總結下.
並不是所有的圖片都可以繪制.圖片的選擇要考慮用代碼繪制的成本.如果色塊和線條過多,耗費的人力和時間成本太高,可能就沒有必要了.實際工作中會讓UI提供svg格式的圖片,然後拖到paintCode中生成代碼.如果圖片過於負責,人物肖像,頭發,皮膚什麼的,直接放一張圖片也是可以的.最後就是生成圖片非常依賴貝塞爾曲線,以這個標准很容易衡量是否適合繪制.
繪制的上下文
UIGraphicsGetCurrentContext();這個方法在drewRect等方法中直接使用沒有問題,但是直接調用創建圖片的時候會出現問題,解決方法是自己創建一個上下文.
UIGraphicsBeginImageContextWithOptions(CGSizeMake(bounds.size.width, bounds.size.height),
false, [UIScreen mainScreen].scale);
繪制速度.
低端機型如4s會出現有的圖片繪制速度很慢,影響用戶體驗,因此可以放入後台或異步線程繪制.
圖片緩存.
一般來說,繪制是比較耗時的,繪制完成圖片會保存到本地,下次使用的時候先判斷有無該圖片,沒有才進行繪制.
//從文件中讀取圖片
CGRect bounds = CGRectMake(0, 0, 640, 720);
NSString *path = [self imagePathWithImageName:@"圖片名稱"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
if (image) {
return image;
}
//如果文件不存在,則開始繪制.首先創建一個context UIGraphicsBeginImageContextWithOptions(CGSizeMake(bounds.size.width, bounds.size.height), false, [UIScreen mainScreen].scale);
//獲取從paitCode自動生成的代碼
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat scale = [self scale];
CGContextScaleCTM(context, scale, scale);
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);
UIColor* color3 = [UIColor colorWithRed: 0.936 green: 0.936 blue: 0.936 alpha: 0.5];
CGContextSaveGState(context);
CGContextBeginTransparencyLayer(context, NULL);
//以下代碼是paintCode自動生成的
UIBezierPath* bezierPath = UIBezierPath.bezierPath;
[bezierPath moveToPoint: CGPointMake(0.07, 0)];
...
bezierPath.usesEvenOddFillRule = YES;
[color3 setFill];
[bezierPath fill];
CGContextEndTransparencyLayer(context);
CGContextRestoreGState(context);
CGContextAddPath(context, bezierPath.CGPath);
//最後,將圖片保存到本地
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
return image;