IOS截屏

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都绘制一遍,才能把所有内容都截取出来......

posted on   仅此而已_  阅读(1333)  评论(0编辑  收藏  举报

编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示