知方号

知方号

iOS 截屏分享(包含状态栏与不包含状态栏)

iOS8以上的新方法PhotoKit

监听截图相册变化,取最后一张图片:http://www.hangge.com/blog/cache/detail_1515.html

PhotoKit 获取本机相册列表 PHAssetCollection有一个名为 Screenshots的智能相册,获取这里面最新的一张图片,即可获取用户刚刚截屏的图片

自己截取屏幕,兼容iOS7-iOS10:带状态栏

OTScreenshotHelper oc 开源库 https://github.com/OpenFibers/OTScreenshotHelper

直接使用 OTScreenshotHelper 截图效果如下: 不知道为什么头部和底部的view是透明的,上下两个view都设置了毛玻璃效果,但是截图出来view背景透明

目前解决方案是不带状态栏的,所以试过各种方案之后还是两个方案融合在一起:使用OTScreenshotHelper截图状态栏, 使用不带状态栏方案截取主体部分

1. 刚刚拷贝源码到swift项目 UIView+OTStatusBarReference.m #import "UIView+ComOpenThreadOTScreenshotHelperStatusBarReference.h"#import "ComOpenThreadOTScreenshotHelperSwizzleHelper.h"// 这一行需要移动到 import 语句下面,不然会报库找不到static UIView *statusBarInstance = nil; OTScreenShotHelper.h 把#import 增加:#import 解决UIView 提示找不到的问题 2. OTScreenShotHelper.h 中暴露mergeStatusBarToContext方法

这个方法在OTScreenShotHelper 其实已经实现了,就是没有暴露给外面调用

+ (void)mergeStatusBarToContext:(CGContextRef)context rect:(CGRect)rect screenshotOrientation:(UIInterfaceOrientation)o; 3. 在现有截图代码位置调用mergeStatusBarToContext for subWindow in (UIApplication.shared.windows) {context.saveGState()context.translateBy(x: subWindow.center.x, y: subWindow.center.y)context.concatenate(subWindow.transform)context.translateBy(x: -subWindow.bounds.size.width * subWindow.layer.anchorPoint.x,y: -subWindow.bounds.size.height * subWindow.layer.anchorPoint.y)if (orientation == UIInterfaceOrientation.landscapeLeft) {context.rotate(by: CGFloat(M_PI_2))context.translateBy(x: 0, y: -imageSize.width)}else if (orientation == UIInterfaceOrientation.landscapeRight) {context.rotate(by: -CGFloat(M_PI_2))context.translateBy(x: -imageSize.width, y: 0)}else if (orientation == UIInterfaceOrientation.portraitUpsideDown) {context.rotate(by: CGFloat(M_PI))context.translateBy(x: -imageSize.width, y: -imageSize.height)}if ( subWindow.responds(to: #selector(UIWindow.drawHierarchy(in:afterScreenUpdates:))) ){subWindow.drawHierarchy(in: subWindow.bounds, afterScreenUpdates: true)} else {subWindow.layer.render(in: context)}context.restoreGState()// 这部分是截图带有statusbar的关键,在这里把状态栏截图动态添加到了原有图片中,在未带状态栏截图代码如下位置添加如下代码即可let statusBarRect = CGRect(x: 0, y: 0, width: AppWidth, height: 20)OTScreenshotHelper.mergeStatusBar(to: context, rect: statusBarRect, screenshotOrientation: orientation)// End}let image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image

未带状态栏截图代码参见: https://gist.github.com/buoge/a94798cd49854a569fdc32825c015167

自己截取屏幕,兼容iOS7-iOS10:不带状态栏

swift版截图并展示 https://gist.github.com/buoge/a94798cd49854a569fdc32825c015167

这个代码有个问题在播放视频的页面播放,截取出来是黑屏

参考原文oc版 http://blog.csdn.net/hitwhylz/article/details/38386979?utm_source=tuicool&utm_medium=referral

iOS 7.0之后有系统事件 原理简单的说下:iOS 7.0之后加入了一个系统通知 UIApplicationUserDidTakeScreenshotNotification 截屏触发的通知

hangge扩展阅读 图片保存到本地 http://www.hangge.com/blog/cache/detail_1102.html

SwViewCapture 没有考虑到mkwebview,webview截图,截图闪屏等等问题 http://blog.startry.com/2016/02/24/Screenshots-With-SwViewCapture

ImageHelper 可以很好的处理截图问题 https://github.com/melvitax/ImageHelper Screenshot,Creates an image from a UIView: UIImage(fromView view: UIView)

两张图片合成一张 http://www.superqq.com/blog/2015/08/05/multiple-uiimage-merged/

创建两个UIImageUIImage *image1 = [UIImage imageNamed:@"iOSDevTip"];UIImage *image2 = [UIImage imageNamed:@"CodePush"];创建UIImage的方法有很多种,我们就简单的通过imageNamed:方法来创建。合并之后的sizeCGSize size = CGSizeMake(image1.size.width + image2.size.width, image1.size.height);合并两个UIImage,需要计算合并之后的size。假设这两个UIImage的高度是是相同的,把他们的宽度相加,得到合并之后的UIImage的size。合并方法有了UIImage和size接下来就是把两个UIImage合并,方法如下:UIGraphicsBeginImageContext(size);[image1 drawInRect:CGRectMake(0, 0, image1.size.width, size.height)];[image2 drawInRect:CGRectMake(image1.size.width, 0, image2.size.width, size.height)];UIImage *togetherImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。