美文网首页
iOS 应用内截屏分享

iOS 应用内截屏分享

作者: 梦蕊dream | 来源:发表于2018-01-22 10:34 被阅读952次

需求:捕获用户截屏操作,并建议用户截屏后的操作。虽然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;
}

相关文章

  • iOS 应用内截屏分享

    需求:捕获用户截屏操作,并建议用户截屏后的操作。虽然iOS11 有系统的截屏,但 APP 内截屏可便捷操作。 封装...

  • 应用内截屏

    记录项目中遇到的新鲜的未接触过的方法。 前几天遇到一个需要在分享图片(应用内截图)的需求,原先并不知道还可以用代码...

  • iOS应用内截屏并分享(大致思路)

    京东和微博都有类似的功能:使用系统截屏功能时会弹出截图分享界面。其实这个功能思路很简单。第一步:注册监听截屏功能的...

  • iOS 如何获取截屏图片并且展示出来呢?

    现在很多iOS应用涉及到活动什么的分享什么的用到把当前截屏图片放置页面的对应位置,所以今天九聊一聊如何将截屏...

  • RN 中截屏react-native-view-shot

    应用场景: 对应用中的某一个界面进行截屏并保存(Android 和 IOS) (特殊情况是对该截屏进行图片拼接,本...

  • flutter:截屏

    1.flutter-截屏组件 2.flutter-截屏插件 3.flutter-iOS原生截屏 iOS代码 4.获...

  • (最新)iOS截屏

    ios webview 截屏:ios截屏 前言:介绍一下截屏有很多种做法1:截当前屏幕内容2:截整个视图的所有内容...

  • iOS截屏分享

    类似长图截屏分享的功能把整个view给完整的截下来,做成一张图片。

  • ios截屏

    ios截屏

  • 针对WKWebView进行内容的截屏。

    最近项目中需要截屏分享的功能,之前也了解过iOS截屏的技术,并写了关于截屏的笔记,兴冲冲的拿着代码稍作修改,对WK...

网友评论

      本文标题:iOS 应用内截屏分享

      本文链接:https://www.haomeiwen.com/subject/yzkuoxtx.html