Ios iPhone快照,包括键盘

Ios iPhone快照,包括键盘,ios,objective-c,uikeyboard,snapshot,uiwindow,Ios,Objective C,Uikeyboard,Snapshot,Uiwindow,我正在寻找正确的方法来抓拍整个iPhone屏幕,包括键盘 我找到了一些用于快照屏幕的代码: CGRect screenCaptureRect = [UIScreen mainScreen].bounds; UIView *viewWhereYouWantToScreenCapture = [[UIApplication sharedApplication] keyWindow]; //screen capture code UIGraphicsBeginImageContextWithOptio

我正在寻找正确的方法来抓拍整个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();
但它也不能捕获键盘。键盘窗口似乎不包含键盘视图

顺便说一句,我需要
UIImage
作为最终结果,而不是
UIView
,因此我不能使用其他快照API


你有什么想法可以做到这一点,并以最好的性能

没错,键盘显示在另一个窗口中。因此,与使用
[[UIApplication sharedApplication]keyWindow]
只获取一个窗口不同,您应该使用
[[UIApplication sharedApplication]windows]
获取所有窗口,并为每个窗口调用
[viewWhereYouWantToScreenCapture drawViewHierarchyInRect:screenCaptureRect afterScreenUpdates:NO]
以便将所有这些内容都绘制在一个图像上下文中。

iOS在一个窗口下渲染键盘,该窗口的描述为
uitextfectswindow

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

用于[[UIApplication sharedApplication]窗口]中的(UIWindow*窗口){
如果([window.class.description isEqualToString:@“UITextEffectsSwindow”]){
返回窗口;
}
}


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

键盘放在其他窗口中。而在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;
}

请检查这篇文章>这是使用私有api吗?拍摄键盘截图不是使用私有api。但是,在屏幕截图中不会看到自定义键盘(如快捷键)。该窗口不在您的进程中。