iPhone快照包括键盘

时间:2015-01-27 11:50:55

标签: ios objective-c uikeyboard snapshot uiwindow

我正在寻找合适的方式来拍摄整个iPhone屏幕,包括键盘。

我找到了一些快照屏幕的代码:

CGRect screenCaptureRect = [UIScreen mainScreen].bounds;
UIView *viewWhereYouWantToScreenCapture = [[UIApplication sharedApplication] keyWindow];
//screen capture code
UIGraphicsBeginImageContextWithOptions(screenCaptureRect.size, NO, [UIScreen mainScreen].scale);
[viewWhereYouWantToScreenCapture drawViewHierarchyInRect:screenCaptureRect afterScreenUpdates:NO];
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

但它也没有抓住键盘。它看起来像keyWindow不包括键盘视图。

btw我需要UIImage作为最终结果,而不是UIView,所以我不能使用其他快照API。

有任何想法,并以最佳表现?

3 个答案:

答案 0 :(得分:8)

键盘放在其他窗口中。并且在iOS9键盘配件中放置了不同的一个。因此,最好的解决方案是渲染所有窗口。

这是工作代码:

- (UIImage*)fullScreenShot {
    CGSize imgSize = [UIScreen mainScreen].bounds.size;
    UIGraphicsBeginImageContextWithOptions(imgSize, NO, 0);
    for (UIWindow* window in [UIApplication sharedApplication].windows) {
        if (![window respondsToSelector:@selector(screen)] || window.screen == [UIScreen mainScreen]) {
            [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
        }
    }
    UIImage* img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

答案 1 :(得分:2)

你是对的,键盘显示在另一个窗口中。因此,不是只使用[[UIApplication sharedApplication] keyWindow]获取一个窗口,而是应该使用[[UIApplication sharedApplication] windows]获取所有窗口,并为每个窗口调用[viewWhereYouWantToScreenCapture drawViewHierarchyInRect:screenCaptureRect afterScreenUpdates:NO],以便所有窗口都在一个图像上下文中绘制。

答案 2 :(得分:1)

iOS在具有描述UITextEffectsWindow

的窗口下呈现键盘

您可以使用以下方法迭代所有窗口并找到正确的窗口:

for (UIWindow *window in [[UIApplication sharedApplication] windows]) { if ([window.class.description isEqualToString:@"UITextEffectsWindow"]) { return window; } }

完成后,您可以使用renderInContextdrawViewHierarchyInRect将其渲染到您的上下文中。 renderInContext可能更慢但更安全(因为它在主线程上完成)并且drawViewHierarchyInRect更快(不会影响主线程),但可能会因为a而崩溃iOS代码中的错误。