需求:捕获用户截屏操作,并建议用户截屏后的操作。虽然iOS11 有系统的截屏,但 APP 内截屏可便捷操作。
封装工具类
实现功能:
- 获取到截屏的图片
- 展示截屏图片和相关操作
- 定时器,规定时间后取消展示
tool.h
#import <Foundation/Foundation.h>
@interface LPScreenShotTool : NSObject
+ (instancetype) sharedScreenShot;
- (void)embedApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
@end
tool.m
#import "LPScreenShotTool.h"
@interface LPScreenShotTool()
@property (nonatomic, strong) UIView *shotView;
@property (nonatomic, weak) NSTimer *timer;//定时器
@property (nonatomic, assign) NSInteger timerNum;//定时器时间,用于循环
@end
@implementation LPScreenShotTool
static id _instace;
+ (instancetype) sharedScreenShot{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[LPScreenShotTool alloc]init];
});
return _instace;
}
+ (id)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}
- (id)copyWithZone:(NSZone *)zone {
return _instace;
}
- (void)embedApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 注册截屏通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidTakeScreenshot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
}
// 执行截屏相应事件
//画 UI,处理功能,自定义代码
- (void)userDidTakeScreenshot:(NSNotification *)notification {
UIImage *image = [self imageWithScreenshot];
UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:0];
_shotView = [[UIView alloc] initWithFrame:CGRectMake(0, ScreenHeight-200, ScreenWidth, 200)];
_shotView.backgroundColor = [BlueBGColor colorWithAlphaComponent:0.85];
//添加显示
UIImageView *imgPhoto = [[UIImageView alloc]initWithImage:image];
imgPhoto.frame = CGRectMake(30, 15, 100, _shotView.height-30);
//添加边框
imgPhoto.layer.borderColor = [[UIColor whiteColor] CGColor];
imgPhoto.layer.borderWidth = 1.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;
[_shotView addSubview:imgPhoto];
[window addSubview:_shotView];
_timerNum = 4;
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerStepStart) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
}
- (void)timerStepStart{
if (_timerNum == 0) {
if ([self.timer isValid]) {
[self.timer invalidate];
self.timer = nil;
[_shotView removeFromSuperview];
}
return;
}
_timerNum = _timerNum - 1;
}
- (UIImage *)imageWithScreenshot {
NSData *imageData = [self dataWithScreenshotInPNGFormat];
return [UIImage imageWithData:imageData];
}
// 获取到截屏图片
- (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);
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIApplicationUserDidTakeScreenshotNotification" object:nil];
[self.timer invalidate];
self.timer = nil;
[_shotView removeFromSuperview];
}
@end
如何引用
AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[LPScreenShotTool sharedScreenShot] embedApplication:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}