1. 程式人生 > >iOS開發——監聽系統截圖並獲得截圖(含狀態列statusBar和鍵盤keyboard)

iOS開發——監聽系統截圖並獲得截圖(含狀態列statusBar和鍵盤keyboard)

補充:經過真機測試,這份程式碼一點用都沒有-_-

專案需要得到獲得截圖然後生成自己的分享圖,某度能找到的基本都是怎麼獲取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的影象繪製還不是很瞭解,所以這些通過上下文繪製圖像的方法還是很讓我迷惑的,就當做是給自己挖個坑,慢慢接觸吧。