廢話不說,先上需求:
用戶手動(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é)。