title: 長(zhǎng)圖懈玻、截圖巧婶、繪圖
date: 2017-11-27
categories:
tags: Objective-C,
關(guān)于圖片繪制的內(nèi)容有很多,很難用一篇文章來介紹涂乌。這篇文章只是在工作中遇到的情況艺栈。根據(jù)不同的情況來分別記錄一下當(dāng)時(shí)是怎么處理的。
[TOC]
長(zhǎng)圖
在某些滾動(dòng)視圖里面湾盒,可能遇到一張長(zhǎng)圖來展示所有的內(nèi)容湿右。
在繼承UIScrollView的視圖里,可以通過如下方式來生成長(zhǎng)圖罚勾。
UIImage* image = nil;
UIGraphicsBeginImageContext(scrollView.contentSize);
{//重點(diǎn)毅人,既要獲取整個(gè)scrollerView,又要保證不破環(huán)界面本身
CGPoint savedContentOffset = scrollView.contentOffset; // 內(nèi)容偏移
CGRect savedFrame = scrollView.frame;
scrollView.contentOffset = CGPointZero;
scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();
scrollView.contentOffset = savedContentOffset;
scrollView.frame = savedFrame;
}
UIGraphicsEndImageContext();
使用
UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0);
替換
UIGraphicsBeginImageContext(scrollView.contentSize);
處理圖片失真的問題。
tlayer層的大小取決于frame尖殃,不是contentSize丈莺。
某個(gè)UI控件的內(nèi)容
這個(gè)其實(shí)是最常見的需求情況,比如某個(gè)圖片是某種宣傳渠道送丰。你們后臺(tái)沒有搞不同機(jī)型返回不同的圖片缔俄。
其實(shí)這個(gè)時(shí)候完全可以直接把讀取到的圖片,但是器躏,有的時(shí)候圖片需要進(jìn)行處理(比如圓角俐载、邊框、顯示卡片的樣式等)登失。這種情況下沒辦法對(duì)網(wǎng)絡(luò)請(qǐng)求的圖片直接存儲(chǔ)遏佣。這時(shí)可以把需要生成圖片的控件做繪制存儲(chǔ)。
UIGraphicsBeginImageContext(currentView.bounds.size); //currentView 當(dāng)前的view 創(chuàng)建一個(gè)基于繪圖的圖形上下文并指定大小為當(dāng)前視圖的bounds
[currentView.layer renderInContext:UIGraphicsGetCurrentContext()]; //renderInContext呈現(xiàn)接受者及其子范圍到指定的上下文
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); //返回一個(gè)基于當(dāng)前圖形上下文的圖片
UIGraphicsEndImageContext(); //移除棧頂?shù)幕诋?dāng)前位圖的圖形上下文
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); //然后將該圖片保存到圖片圖
在畫布上添加UI元素來繪制圖片
這種需求可能會(huì)在下面這樣的場(chǎng)景中遇到:宣傳用的落地頁(yè)揽浙。
因?yàn)檫@種場(chǎng)景中一般都會(huì)有數(shù)額等信息状婶,這些數(shù)值每個(gè)用戶是不一樣的。這個(gè)時(shí)候就需要在模板上繪制出這些會(huì)變動(dòng)的信息捏萍。
以某個(gè)項(xiàng)目中的戰(zhàn)績(jī)海報(bào)為例:
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
+ (UIImage *)createShareImageWithID:(NSString *)userid totalIncome:(NSString *)totalIncome taskIncome:(NSString *)taskIncome apprenticeIncome:(NSString *)apprenticeIncome apprenticeNumber:(NSString *)apprenticeNumber userIcon:(NSString *)userIcon qrCode:(NSString *)qrCode {
UIImage *image = [UIImage imageNamed: @"imageNameString"];
CGSize size= CGSizeMake(image.size.width, image.size.height); // 畫布大小 圖片大小固定的.
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); // 尺寸 不透明 無(wú)縮放
[image drawAtPoint:CGPointMake(0, 0)];
// 獲得一個(gè)位圖圖形上下文
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawPath (context, kCGPathStroke);
//繪制二維碼
NSData *ewmData = [NSData dataWithContentsOfURL:[NSURL URLWithString:qrCode]];
UIImage *ewmImage = [UIImage imageWithData:ewmData];
[ewmImage drawInRect:CGRectMake(90, 750, 140, 140) ];
//
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentCenter;
NSMutableAttributedString *apprenticeAttributedStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ 人", apprenticeNumber]];
NSUInteger apprenticeStrLength = apprenticeAttributedStr.length;
[apprenticeAttributedStr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:52.f],NSForegroundColorAttributeName:UIColorFromRGB(0x27313e),NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, apprenticeStrLength-2)];
[apprenticeAttributedStr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:28.f],NSForegroundColorAttributeName:UIColorFromRGB(0x27313e),NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(apprenticeStrLength-1, 1)];
[apprenticeAttributedStr drawInRect:CGRectMake(0, 610, 375, 300)];
NSMutableAttributedString *totalIncomeAttributeStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ 元", apprenticeIncome]];
NSUInteger totalIncomeStrLength = totalIncomeAttributeStr.length;
[totalIncomeAttributeStr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:52.f],NSForegroundColorAttributeName:UIColorFromRGB(0x27313e),NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, totalIncomeStrLength-2)];
[totalIncomeAttributeStr addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:28.f],NSForegroundColorAttributeName:UIColorFromRGB(0x27313e),NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(totalIncomeStrLength-1, 1)];
[totalIncomeAttributeStr drawInRect:CGRectMake(375, 610, 375, 300)];
UIImage *tempImg = [UIImage imageNamed:@"show_btn"];
[tempImg drawInRect:CGRectMake(145, 980, 460, 161)];
// 返回繪制的新圖形
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
IMG_0800.JPG
系統(tǒng)API
/* Called via the -display method when the `contents' property is being
* updated. Default implementation does nothing. The context may be
* clipped to protect valid layer content. Subclasses that wish to find
* the actual region to draw can call CGContextGetClipBoundingBox(). */
- (void)drawInContext:(CGContextRef)ctx;
/** Rendering properties and methods. **/
/* Renders the receiver and its sublayers into 'ctx'. This method
* renders directly from the layer tree. Renders in the coordinate space
* of the layer.
*
* WARNING: currently this method does not implement the full
* CoreAnimation composition model, use with caution. */
- (void)renderInContext:(CGContextRef)ctx;