iOS 捕捉截屏,并獲取截屏圖片

廢話不說,先上需求:

用戶手動(dòng)截屏(home加鎖屏鍵),app在打開聊天模塊時(shí)能夠提示用戶是不是要發(fā)送剛才截屏的那張圖片(類型微信和qq)。
iOS7之后,我大概想到的思路有兩種:

  • 1.注冊(cè)UIApplicationUserDidTakeScreenshotNotification通知,發(fā)生截屏后,從相冊(cè)中取最新一張圖片,把圖片路徑存儲(chǔ)下來,在聊天發(fā)消息事件觸發(fā)時(shí)顯示出來;
  • 2.注冊(cè)UIApplicationUserDidTakeScreenshotNotification通知,發(fā)生截屏后模擬用戶截取當(dāng)前屏幕,獲取UIImage,保存起來,在聊天發(fā)消息事件觸發(fā)時(shí)顯示出來。

區(qū)別就是一個(gè)是從相冊(cè)獲取保存路徑,一個(gè)是自己模擬截屏,保存UIImage。第二種網(wǎng)上很多例子,我就不寫了,下面講下第一種的實(shí)現(xiàn),有幾個(gè)要注意的,分享給大家。

流程:

1.appdelegate注冊(cè)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(takeScreenShot:) name:UIApplicationUserDidTakeScreenshotNotification object:nil];//截屏通知

2.實(shí)現(xiàn)takeScreenShot:

[assetsLib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
  if (result) {
      NSURL *url = result.defaultRepresentation.url;
    [commonObj.screenShotDic setObject:url forKey:@"shot"];//全局單例
    *stop = YES;
}}];
*stop = YES;
}} failureBlock:^(NSError *error) {
}];

3展示

if ([commonObj.screenShotDic objectForKey:@"screenShot"]) {
NSURL * imgUrl = [commonObj.screenShotDic objectForKey:@"shot"];
if (imgUrl) {
[shotV showMenuOnView:mainTV atPoint:CGPointZero withImageUrl:imgUrl];
}
}

大概流程是這樣,但是這里有個(gè)問題就是截屏后執(zhí)行takeScreenShot方法時(shí),截屏的圖片還沒有保存在相冊(cè),這樣你獲取到的最新一張圖片就不是剛才截屏的那一張,因此改造。

1,在appdelegate增加一個(gè)通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(photoAblumChanged:) name:ALAssetsLibraryChangedNotification object:assetsLib];//相冊(cè)變化通知
2,photoAblumChanged 和 takeScreenShot

- (void)takeScreenShot:(NSNotification *)notice{
//取相冊(cè)最新一張照片
ALAuthorizationStatus kStatus = [ALAssetsLibrary authorizationStatus];
if (kStatus == ALAuthorizationStatusAuthorized) {
isScreenShot = YES; //成員變量
}
}
- (void)photoAblumChanged:(NSNotification *)notice{
if (!isScreenShot) {
return;
}
isScreenShot = NO;
[assetsLib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
NSURL *url = result.defaultRepresentation.url;
[commonObj.screenShotDic setObject:url forKey:@"shot"];
*stop = YES;
}
}];
*stop = YES;
}
} failureBlock:^(NSError *error) {
}];
}

這樣就解決了截屏后獲取圖片不對(duì)的情況,但是ALAssetsLibraryChangedNotification有點(diǎn)小坑,就是在初始化時(shí)需要寫上這個(gè)不然會(huì)不執(zhí)行通知方法

isScreenShot = NO;
assetsLib = [[ALAssetsLibrary alloc] init];
[assetsLib writeImageToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { }];//防止相冊(cè)變化通知不工作

完結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容