前言
目前市面上的一些主流App,比如:京东、淘宝、支付宝 等,他们都含所有手机截屏分享或者反馈的功能。它们实现这个功能的作用到底为了什么?个人感觉是:为了满足App的应用需求,同时更重要的是用户不用在点击手机的【Home】键返回到主页,再打开WeChat、QQ、Sina等App在找到我们截取的图片在进行反馈和分享。那么这个功能怎么实现呢?请您往下看……
一 、题为手机截屏,那怎么知道手机截屏了呢?
首先这也是我们要首先介绍的一个重要功能。在我们的 UIKit 里面的 UIApplication.h 中有一个通知的Key。该通知如下:
// This notification is posted after the user takes a screenshot (for example by pressing both the home and lock screen buttons)
UIKIT_EXTERN NSNotificationName const UIApplicationUserDidTakeScreenshotNotification NS_AVAILABLE_IOS(7_0);
通过上面方法的说明可以知道当我们同时按住 Home 和 锁屏键系统就会触发该通知。那么为了能够在整个App中都能实现触发该通知,我们就在 App 的 AppDelegate.h 中添加监控该通知的代码,如下:
**/**!
添加截屏事件的观察者
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenshotsEventMethod) name:UIApplicationUserDidTakeScreenshotNotification object:nil];**
二、我们已经知道用户触发了截屏,那么截屏功能怎么实现呢?
1、我们首先创建一个大小都为 0 的 CGSize 实例。代码如下:
CGSize imageSize = CGSizeZero ;
2、首先截屏我们要知道当前用户的手机是处于那种方向(竖屏&横屏),并确定截屏的图像 CGSize 的大小。代码如下:
/**
确定当前屏幕的方向
*/
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);
}
3、我们通过 CGSize 开启图像的上下文,在有图像的 View 获得 CGContextRef 上下文。代码如下:
/**
开启图像上下文,并设置上下文
*/
UIGraphicsBeginImageContext(imageSize);
/**
获得上下文
*/
CGContextRef cContext = UIGraphicsGetCurrentContext() ;
4、通过遍历 App视图显示当前的所有窗口,来获取截取的图像。关键代码如下:
for (UIWindow * tempWindow in [UIApplication sharedApplication].windows) {
/**
先保存上下文,便于恢复场景
*/
CGContextSaveGState(cContext) ;
/**
调整上下文的位置
*/
CGContextTranslateCTM(cContext, t