iOS 应用内截屏分享

需求:捕获用户截屏操作,并建议用户截屏后的操作。虽然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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,637评论 25 708
  • 2017.1.16 武功山 前年,一行人计划四处漂流,却辗转多无定数。人生历...
    南方有南初阅读 566评论 0 5
  • 睁开眼睛 看到了黑夜 窗外滴滴答答的秋雨 屋子里的桌椅、茶杯、灯光都跑了 剩下的还是雨滴穿过阶石的唏嘘 触摸到的都...
    式微_fe7e阅读 228评论 0 0
  • 日子顺风顺水却被过的半死不活,你是不是问过自己:活着是为了什么?屡受挫折,事事不随人愿时,你是否问过自己:人...
    舒骅阅读 523评论 0 0
  • 贺年 , 万象更新开颜. 桔红春绿鸿运伴 闻鸡起舞抱负坚. 开年 , 金光灿烂眼前, 相约再会衣锦还, 到时煮酒庆凱旋.
    王卓族阅读 306评论 0 0