IOS好多地方可能用到截屏的, 比如保存当前页面到相册、完成某种动画,一般截屏的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
static UIImage * screenShot(UIView *view){ CGSize imageSize = view.frame.size; if
( NULL != UIGraphicsBeginImageContextWithOptions) { UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0); } else { UIGraphicsBeginImageContext(imageSize); } CGContextRef c = UIGraphicsGetCurrentContext(); //CGContextTranslateCTM(c, 0, 0); // <-- shift everything up by 40px when drawing. [view.layer renderInContext:c]; UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return
viewImage; } |
UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)
参数1: 图片的画布大小,参数2: 是否是透明的图片,不透明默认背景为白色,参数3: 图片的比例,其中0.0代表根据当前屏幕的屏幕来决定
renderInContext:(CGContextRef)ctx 表示把当前的layer绘制到当前的画布上,
还可以通过修改移动旋转当前上下文,自己绘制想要的图片(那就与截屏无关了)
对于正常的view使用以上的方法就可以了,但对于像ScrollerView/UITableView中,这种可以滚动的视图截取屏幕图片会有一些小的改动:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
static UIImage * screenShotUIScrollView(UIScrollView *view){ CGSize imageSize = view.contentSize; if
( NULL != UIGraphicsBeginImageContextWithOptions) { UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0); } else { UIGraphicsBeginImageContext(imageSize); } CGContextRef c = UIGraphicsGetCurrentContext(); //CGContextTranslateCTM(c, 0, 0); // <-- shift everything up by 40px when drawing. [view.layer renderInContext:c]; UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGImageRef imgeref = CGImageCreateWithImageInRect(viewImage.CGImage, CGRectMake(view.contentOffset.x*2,view.contentOffset.y*2 , view.bounds.size.width*2 , view.bounds.size.height*2)); UIImage *image = [UIImage imageWithCGImage:imgeref]; return
image; } |
基本就是先把scrollview的所有内容都先截取出来,再根据当前的frame和contentOffset截取图片。
对于tableview截取所有内容的图片的话,因为tableview涉及到重用,在上面只有固定的可见的几个cell,对于没有展示出来的indexpath是没有cell去绘制的,如果把scrollview的所有内容都先截取出来,会出来大部分为空白的情况(重用所致),所以可以试一下,不断的修改tableview的偏移量,然后改变画布的Translate(相当于把图片拼接起来)截取,这样可以让tableview把所有的cell都绘制一遍,才能把所有内容都截取出来......
原文:http://www.cnblogs.com/easy-coding/p/3548542.html