iOS-檢測(cè)用戶(hù)截屏,獲取截取圖片

原文地址:http://blog.csdn.net/hitwhylz/article/details/38386979?utm_source=tuicool&utm_medium=referral

之前看淘寶有,截屏后彈出截取圖片(Home + Power),可以分享給好友這種功能。就上網(wǎng)搜了一下踢械,感謝大神的分享。

(在iOS7之前, 如果用戶(hù)截屏魄藕,系統(tǒng)會(huì)自動(dòng)取消屏幕上的所有 touch 事件内列,(使用 touchesCancelled:withEvent: 這個(gè)方法)那么我們就可以檢測(cè)這個(gè)方法的調(diào)用,然后加載本地最新圖片再加以判斷來(lái)實(shí)現(xiàn)我們的目的泼疑。但在 iOS 7 之后德绿,截屏不再會(huì)取消屏幕的 touch 事件,所以導(dǎo)致了 Snapchat 和 Facebook Poke 之類(lèi)的應(yīng)用在 iOS 7 剛發(fā)布時(shí)依賴(lài)于系統(tǒng)這個(gè)行為的功能受到影響退渗。

如果不采取任何新措施, 我們可以讓?xiě)?yīng)用啟動(dòng)后在后臺(tái)循環(huán)檢測(cè)相冊(cè)內(nèi)最新一張照片移稳,看它的是否符合截屏的特征。這種方法可行会油,但這是個(gè)笨方法个粱,需要用戶(hù)允許你的程序訪問(wèn)相冊(cè)才可以,并且一直在后臺(tái)循環(huán)會(huì)消耗更多的系統(tǒng)資源翻翩。

當(dāng)然, 蘋(píng)果封閉了一些東西, 肯定也會(huì)給你開(kāi)放其他東西, 不會(huì)讓你走上絕路的都许。

iOS7提供一個(gè)嶄新的推送方法:UIApplicationUserDidTakeScreenshotNotification。只要像往常一樣訂閱即可知道什么時(shí)候截圖了嫂冻。

注意:UIApplicationUserDidTakeScreenshotNotification 將會(huì)在截圖完成之后顯示〗赫鳎現(xiàn)在在截圖截取之前無(wú)法得到通知。

希望蘋(píng)果會(huì)在iOS8當(dāng)中增加 UIApplicationUserWillTakeScreenshotNotification桨仿。(只有did, 沒(méi)有will顯然不是蘋(píng)果的風(fēng)格...)

下面就寫(xiě)了個(gè)小demo, 檢測(cè)用戶(hù)截屏, 并且獲取截屏照片, 顯示在右下角睛低。

(需要在真機(jī)上運(yùn)行, 至少, 模擬器上我不知道如何模擬截屏行為(Home + Power), 如果你知道, 還望告知))

可以直接看代碼

一。注冊(cè)通知:

[objc] view plain copy

//注冊(cè)通知

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(userDidTakeScreenshot:)

name:UIApplicationUserDidTakeScreenshotNotification object:nil];

二服傍。監(jiān)聽(tīng)截屏:

執(zhí)行操作, 也就是實(shí)現(xiàn)上面通知對(duì)應(yīng)的響應(yīng)函數(shù)? -- userDidTakeScreenshot

[objc] view plain copy

//截屏響應(yīng)

- (void)userDidTakeScreenshot:(NSNotification *)notification

{

NSLog(@"檢測(cè)到截屏");

//人為截屏, 模擬用戶(hù)截屏行為, 獲取所截圖片

UIImage *image_ = [self imageWithScreenshot];

//添加顯示

UIImageView *imgvPhoto = [[UIImageView alloc]initWithImage:image_];

imgvPhoto.frame = CGRectMake(self.window.frame.size.width/2, self.window.frame.size.height/2, self.window.frame.size.width/2, self.window.frame.size.height/2);

//添加邊框

CALayer * layer = [imgvPhoto layer];

layer.borderColor = [

[UIColor whiteColor] CGColor];

layer.borderWidth = 5.0f;

//添加四個(gè)邊陰影

imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor;

imgvPhoto.layer.shadowOffset = CGSizeMake(0, 0);

imgvPhoto.layer.shadowOpacity = 0.5;

imgvPhoto.layer.shadowRadius = 10.0;

//添加兩個(gè)邊陰影

imgvPhoto.layer.shadowColor = [UIColor blackColor].CGColor;

imgvPhoto.layer.shadowOffset = CGSizeMake(4, 4);

imgvPhoto.layer.shadowOpacity = 0.5;

imgvPhoto.layer.shadowRadius = 2.0;

[self.window addSubview:imgvPhoto];

}

我這里的 userDidTakeScreenshot 總共做了3件事

1.打印檢測(cè)到截屏

2.獲取截屏圖片钱雷。調(diào)用[self imageWithScreenshot]; 這里的imageWithScreenshot是人為截屏, 模擬用戶(hù)截屏操作, 獲取截屏圖片。

3.顯示截屏圖片, 以屏幕1/4大小顯示在右下角, 并且加上白色邊框和陰影效果突出顯示吹零。

三罩抗。獲取截屏圖片

/**

*? 截取當(dāng)前屏幕

*

*? @return NSData *

*/

- (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);

}

/**

*? 返回截取到的圖片

*

*? @return UIImage *

*/

- (UIImage *)imageWithScreenshot

{

NSData *imageData = [self dataWithScreenshotInPNGFormat];

return [UIImage imageWithData:imageData];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灿椅,隨后出現(xiàn)的幾起案子套蒂,更是在濱河造成了極大的恐慌钞支,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件操刀,死亡現(xiàn)場(chǎng)離奇詭異伸辟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)馍刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窃蹋,“玉大人卡啰,你說(shuō)我怎么就攤上這事【唬” “怎么了匈辱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杀迹。 經(jīng)常有香客問(wèn)我亡脸,道長(zhǎng),這世上最難降的妖魔是什么树酪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任浅碾,我火速辦了婚禮,結(jié)果婚禮上续语,老公的妹妹穿的比我還像新娘垂谢。我一直安慰自己,他們只是感情好疮茄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布滥朱。 她就那樣靜靜地躺著,像睡著了一般力试。 火紅的嫁衣襯著肌膚如雪徙邻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天畸裳,我揣著相機(jī)與錄音缰犁,去河邊找鬼。 笑死躯畴,一個(gè)胖子當(dāng)著我的面吹牛民鼓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓬抄,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丰嘉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嚷缭?” 一聲冷哼從身側(cè)響起饮亏,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耍贾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后路幸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荐开,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年简肴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晃听。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砰识,死狀恐怖能扒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辫狼,我是刑警寧澤初斑,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站膨处,受9級(jí)特大地震影響见秤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜真椿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一鹃答、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧突硝,春花似錦挣跋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至修噪,卻和暖如春查库,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黄琼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工樊销, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脏款。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓围苫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撤师。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剂府,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容