iOS开发-检测用户截屏 并获取所截图片
微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好。于是乎, 我也想着实现这个功能。
在iOS7之前, 如果用户截屏,系统会自动取消屏幕上的所有 touch 事件,(使用 touchesCancelled:withEvent: 这个方法)那么我们就可以检测这个方法的调用,然后加载本地最新图片再加以判断来实现我们的目的。但在 iOS 7 之后,截屏不再会取消屏幕的 touch 事件,所以导致了 Snapchat 和 Facebook Poke 之类的应用在 iOS 7 刚发布时依赖于系统这个行为的功能受到影响。
如果不采取任何新措施, 我们可以让应用启动后在后台循环检测相册内最新一张照片,看它的是否符合截屏的特征。这种方法可行,但这是个笨方法,需要用户允许你的程序访问相册才可以,并且一直在后台循环会消耗更多的系统资源。
当然, 苹果封闭了一些东西, 肯定也会给你开放其他东西, 不会让你走上绝路的。
iOS7提供一个崭新的推送方法:UIApplicationUserDidTakeScreenshotNotification。只要像往常一样订阅即可知道什么时候截图了。
注意:UIApplicationUserDidTakeScreenshotNotification 将会在截图完成之后显示。现在在截图截取之前无法得到通知。
希望苹果会在iOS8当中增加 UIApplicationUserWillTakeScreenshotNotification。(只有did, 没有will显然不是苹果的风格...)
下面就写了个小demo, 检测用户截屏, 并且获取截屏照片, 显示在右下角。
(需要在真机上运行, 至少, 模拟器上我不知道如何模拟截屏行为(Home + Power), 如果你知道, 还望告知)
源码git下载链接:colin1994/TakeScreenshotTest
一。注册通知:
//注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidTakeScreenshot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
二。监听截屏:
执行操作, 也就是实现上面通知对应的响应函数 -- userDidTakeScreenshot
//截屏响应- (void)userDidTakeScreenshot:(NSNotification *)notification{ NSLog(@"检测到截屏"); //人为截屏, 模拟用户截屏行为, 获取所截图片 UIImage *image_ = [self imageWithScreenshot]; //添加显示 UIImageView *imgvPhoto = [[UIImageView alloc]initWithImage:image_]; imgvPhoto.frame = CGRectMake(self.window.frame.size.width/2, self.window.frame.size.height/2, self.window.frame.size.width/2, self.window.frame.size.height/2); //添加边框 CALayer * layer = [imgvPhoto layer]; layer.borderColor = [ [UIColor whiteColor] CGColor]; layer.borderWidth = 5.0f; //添加四个边阴影 imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; imgvPhoto.layer.shadowOffset = CGSizeMake(0, 0); imgvPhoto.layer.shadowOpacity = 0.5; imgvPhoto.layer.shadowRadius = 10.0; //添加两个边阴影 imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor; imgvPhoto.layer.shadowOffset = CGSizeMake(4, 4); imgvPhoto.layer.shadowOpacity = 0.5; imgvPhoto.layer.shadowRadius = 2.0; [self.window addSubview:imgvPhoto];}
我这里的 userDidTakeScreenshot 总共做了3件事
1.打印检测到截屏
2.获取截屏图片。调用[self imageWithScreenshot]; 这里的imageWithScreenshot是人为截屏, 模拟用户截屏操作, 获取截屏图片。
3.显示截屏图片, 以屏幕1/4大小显示在右下角, 并且加上白色边框和阴影效果突出显示。
三。获取截屏图片
/** * 截取当前屏幕 * * @return NSData * */- (NSData *)dataWithScreenshotInPNGFormat{ CGSize imageSize = CGSizeZero; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsPortrait(orientation)) imageSize = [UIScreen mainScreen].bounds.size; else imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width); UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); CGContextRef context = UIGraphicsGetCurrentContext(); for (UIWindow *window in [[UIApplication sharedApplication] windows]) { CGContextSaveGState(context); CGContextTranslateCTM(context, window.center.x, window.center.y); CGContextConcatCTM(context, window.transform); CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y); if (orientation == UIInterfaceOrientationLandscapeLeft) { CGContextRotateCTM(context, M_PI_2); CGContextTranslateCTM(context, 0, -imageSize.width); } else if (orientation == UIInterfaceOrientationLandscapeRight) { CGContextRotateCTM(context, -M_PI_2); CGContextTranslateCTM(context, -imageSize.height, 0); } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { CGContextRotateCTM(context, M_PI); CGContextTranslateCTM(context, -imageSize.width, -imageSize.height); } if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES]; } else { [window.layer renderInContext:context]; } CGContextRestoreGState(context); } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return UIImagePNGRepresentation(image);}/** * 返回截取到的图片 * * @return UIImage * */- (UIImage *)imageWithScreenshot{ NSData *imageData = [self dataWithScreenshotInPNGFormat]; return [UIImage imageWithData:imageData];}
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
iOS开发-检测用户截屏 并获取所截图片相关推荐
- ios——如何完成截屏操作并将截屏结果保存到设备本地相册
ios工程--(UIView)获取设备相册权限截取屏幕内容并保存到设备本地相册 设备/引擎:Mac(11.6)/cocos 开发工具:Xcode(13.0) 开发需求:对某个玩法进行截屏操作,并以图片 ...
- ios截屏功能html,滚动截屏APP - iPhone上的长截图工具
话说长截图功能也算是一种刚需了,如今安卓好多手机系统都会自带此功能.很难想象的是,安卓手机标配的「长截图」功能,对果粉来说是多么的奢侈.iPhone没有自带的长截图功能,只能借助第三方APP,比如Ta ...
- android悬浮球截屏,vivoX27怎么双击悬浮球截屏?获取屏幕截图依旧方便快速!
在此前一段时间中,iphone手机有一项功能在抖音中非常的火爆,那就是双击iphone的小白点进行截图的功能,让你不再依赖于截屏快捷键或是实体快捷键也能进行轻松的截图. 而今天我们要说的,是vivoX ...
- 滚动截屏软件_华为指关节截屏不如三指截屏好用?一步到位,实践出真知
华为手机的指关节截屏功能想必只要是用过的朋友都知道,熟悉的朋友更会以此为依赖,比如我,现在换了个其他品牌手机用,一到截屏的时候还是会不由自主地拿指关节划区截屏,因为指关节截屏不仅仅是双击截屏,这个划区 ...
- Windows定时截屏、后台自动截屏工具,带有密码保护功能 —— 定时执行专家
目录 一.软件简介 二.使用教程 1.软件下载 2.软件的安装方法 3.无察觉自动截屏(例如:间隔每 10分钟,执行 1次) 一.软件简介 <定时执行专家>是一款制作精良.功能强大.简单易 ...
- 华为Android10版怎么截屏,华为Mate 10怎么截屏 三种智能截屏方式图文教程
相信所有用户在使用手机的过程中都会使用到截屏功能,那么在华为新款旗舰Mate10 上如何截屏,共有哪些截屏方式呢?下面就让小编给大家带来最详细的Mate10 智能截屏教程. 相信,华为的老用户们应该都 ...
- IOS开发基础之使用AFNetworking框架下载服务器资源图片
IOS开发基础之使用AFNetworking框架下载服务器资源图片 info.plist加入这句 <key>NSAppTransportSecurity</key> <d ...
- 计算机图片怎么截图快捷键,电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?...
电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图? 网际百科资讯 知识宝库 2020-3-18 43955 0评论 电脑截图快捷键四种截屏方式,笔记本电脑如何截屏截图?给你推 ...
- 推荐一款截屏翻译工具|截屏提取文字|划词翻译
推荐一款截屏翻译工具|截屏提取文字|划词翻译 大家有没有过这样的经历,搜索一篇阅读心得或者心得体会的时候,看到自己感兴趣的一篇文章,打算复制下来上交"任务"时,发现复制不了,连 ...
最新文章
- [置顶] ros的navigation之———gmapping应用详解(in ros)
- shiro 实现登录验证功能
- 羽毛球双打“七宗罪”~很详细!
- Android中的Handler总结
- 项目权限管理大纲(RBAC+SpringSecurity)
- IBM MQ Explore使用
- 随想录(搭建自己嵌入式项目的编译系统)
- 如果 AI 技术可以让你永生,你愿意么?
- Java项目的命名规范
- 怎样才能查到4S店保养记录,4S店维修保养记录怎样查询,Javascript学习指南
- 第7周 文件和数据格式化
- 为何现在只剩下 风吹乱我的发
- mp4转换m3u8格式php,m3u8格式怎么转换mp4 ts格式转换 - 下载的m3u8、ts如何转换成mp4...
- 全栈工程师需要了解掌握的技术栈
- excel表格打印每页都有表头_分享|1分钟学会,让打印的表格每页自带标题行
- 微信V3版本支付下单、查询支付订单状态、订单退款接入正式项目中并引入策略模式实操
- MySQL优化那些事
- nyoj 1273 宣传墙
- 如何系统地自学python100天_Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅...
- JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等
热门文章
- 京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了
- 联想YOGA Pro14s酷睿版和华硕灵耀Pro14 2022酷睿版的区别 选哪个好
- 联通押宝iPhone 4到底是福是祸?
- opencv中CV_8UC3什么意思
- EXCEL 下拉时不使用自动增加
- 4.30-5.1cf补题
- 教你用AI十步绘制一个小清新的风车插画
- c语言冷门小知识,C/C++冷门知识点你知道多少呢?
- ChatGPT机会与变现大全
- 大文件读写优化问题。现有两个文件,一个837M的order.tbl,一个3.62G的lineitem.tbl,对这两个表进行嵌套连接