iOS開發——監聽系統截圖並獲得截圖(含狀態列statusBar和鍵盤keyboard)
阿新 • • 發佈:2019-01-10
補充:經過真機測試,這份程式碼一點用都沒有-_-
專案需要得到獲得截圖然後生成自己的分享圖,某度能找到的基本都是怎麼獲取View的檢視,但是幾乎沒有提到包含狀態列(貌似只看到一個),而包含鍵盤的就真的沒有了。經過一翻查詢,在stackoverflow上找到了截圖包含鍵盤的方法。以下是實現程式碼:
/*這裡示範的是UIViewController,當然也可以是自定義的UIView之類的*/
- (void)viewDidLoad {
[super viewDidLoad];
...
// iOS7之後 註冊系統截圖通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getScreenshot:)
name:UIApplicationUserDidTakeScreenshotNotification
object:nil];
}
- (void )getScreenshot:(NSNotification *)notification {
//獲取截圖圖片,-screenShot為自定義的方法,實現在下面
UIImage *image = [self screenShot];
// 對得到的截圖進行操作,比如增加邊框之類的
...
}
- (UIImage *)screenShot
{
UIImage * image[2];
for (int i = 0; i < 2; i++) {
if (i == 0) {
// 獲得狀態列view的上下文以繪製圖片
UIView *statusBarView = [[UIApplication sharedApplication] valueForKey:@"_statusBar"];
UIGraphicsBeginImageContext(statusBarView.frame.size);
[statusBarView.layer renderInContext:UIGraphicsGetCurrentContext()];
image[i] = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
} else {
// 獲得其他所有window,包括鍵盤,的上下文並繪製圖片
CGSize roomViewSize = [UIScreen mainScreen].bounds.size;
UIGraphicsBeginImageContextWithOptions(roomViewSize, NO, 0);
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (![window respondsToSelector:@selector(screen)] || window.screen == [UIScreen mainScreen]) {
[window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
}
}
image[i] = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
}
// 將上面得到的兩張圖片合併繪製為一張圖片,最終得到screenshotImage
UIGraphicsBeginImageContext(image[1].size);
[image[1] drawInRect:CGRectMake(0, 0, image[1].size.width, image[1].size.height)];
[image[0] drawInRect:CGRectMake(0, 0, image[0].size.width, image[0].size.height)];
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenshotImage;
}
由於我自己還在邊自學,目前對iOS的影象繪製還不是很瞭解,所以這些通過上下文繪製圖像的方法還是很讓我迷惑的,就當做是給自己挖個坑,慢慢接觸吧。