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 <Foundation/Foundation.h>
增加:
#import <UIKit/UIKit.h>
解决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=referraliOS 7.0之后有系统事件
原理简单的说下:iOS 7.0之后加入了一个系统通知
UIApplicationUserDidTakeScreenshotNotification 截屏触发的通知hangge扩展阅读 图片保存到本地
http://www.hangge.com/blog/cache/detail_1102.htmlSwViewCapture 没有考虑到mkwebview,webview截图,截图闪屏等等问题
http://blog.startry.com/2016/02/24/Screenshots-With-SwViewCaptureImageHelper 可以很好的处理截图问题
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/
创建两个UIImage
UIImage *image1 = [UIImage imageNamed:@"iOSDevTip"];
UIImage *image2 = [UIImage imageNamed:@"CodePush"];
创建UIImage的方法有很多种,我们就简单的通过imageNamed:方法来创建。
合并之后的size
CGSize 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();
iOS 截屏分享(包含状态栏与不包含状态栏)的更多相关文章
- iOS截屏并修改截图然后分享的功能实现
一. 实现的效果类似微博的截图分享 不仅截图分享的时候还进行图片的修改,增加自己的二维码 二.实现方式 苹果在ios7之后提供了一个新的通知类型:UIApplicationUserDidTakeScr ...
- ios截屏代码[转]
http://www.cnblogs.com/chenxiangxi/p/3547974.html 这位博主的连接中将ios自定义大小位置的截屏代码写的很不错,马上就能用的方法,对于只想马上用的程序员 ...
- iOS截屏代码
转载自:http://m.open-open.com/m/code/view/1420469506375 1.普通界面 /** *截图功能 */ -(void)screenShot{ UIGraphi ...
- iOS截屏保存至相册
#pragma mark 截屏并保存至相册 -(void)screenShotsComplete:(void(^)(UIImage * img)) complete { CGSize imageSiz ...
- iOS截屏方法
//获取屏幕截屏方法 - (UIImage *)capture { // 创建一个context UIGraphicsBeginImageContextWithOptions(self.view.bo ...
- iOS截屏功能
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...
- IOS 截屏(保存到相册中)
@interface NJViewController () /** * 点击截屏按钮 */ - (IBAction)captureView:(UIButton *)sender; /** * 白色v ...
- ios截屏事件监听
目的:实现截屏反馈,类似支付宝的截屏上传反馈功能. 1.注册全局通知,在Appdelegate中注册截屏监听通知 - (void)registNotification{ [[NSNotificatio ...
- iOS 截屏,openGL ES 截图,以及像素颜色判断
代码整理了2种截图,类似.(没苹果自带那种截图彻底) 方法一: +(UIImage *)fullScreenshots{ UIWindow *screenWindow = [[UIApplicatio ...
随机推荐
- MySQL的sql_mode解析与设置,sql文件导入报错解决
在往MySQL数据库中插入一组数据时,出错了!数据库无情了给我报了个错误:ERROR 1365(22012):Division by 0:意思是说:你不可以往数据库中插入一个 除数为0的运算的结果.于 ...
- cmd.exe启动参数详解
https://blog.csdn.net/moonhillcity/article/details/53039763 各个系统中打开文件的命令 "windows系统: cmd " ...
- js提取新浪邮箱的信用卡
js提取用户新浪邮箱中的信用卡信息,是js非nodejs. 对比py,之前就做不好,出现了复杂点选验证码.js的开发速度只需要py的三分之一,甚至十分之一. js在客户端执行,py在后端执行,py要实 ...
- selenium+phantomjs渲染网页
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapa ...
- hibernate4.3 无法获取数据库最新值
在用ssh框架的时候遇到一个问题(hibernate版本号4.3) 问题描写叙述:web端和应用程序都能够读写数据库.当应用程序改动数据库后.hibernate无法读取最新值,读出来的一直都是旧数据. ...
- mysql asyn 实战
创建configuration时,发现URLParser找不到,于是只能使用配置文件来,当然使用配置文件比使用URL初始化还要直观些 def configurationWithPassword = n ...
- NetBpm 安装篇(1)
尊重别人劳动成果 转载注明出处:http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主页 http://www.netbpm.org/docs/in ...
- win10进入到安全模式的三种方法
这里介绍三种方法: 如果能够进入到系统 点击开始--设置--更新和安全--恢复,右侧点击高级启动中的立即重启 能够进入到登陆界面 进入到登录屏幕后,在按住 Shift 键的同时依次选择“电源” > ...
- iOS 解决UIScrollView布局问题(布局受statusBar和NavigationBar影响)
iOS APP中有一个非常好用的功能,那就是当我们在滚动一个UIScrollView滚动了很远很远的时候,假如我们想让UIScrollView回到顶部,我们绝大多数人的做法就是慢慢慢慢的滚动UIScr ...
- Resolve PSExec "Access is denied"
PSExec拒绝访问的解决办法 Just modify Windows Registry, and reboot. psexec_fix.reg: Windows Registry Editor Ve ...