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都绘制一遍,才能把所有内容都截取出来......
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具