Ios iPhone快照,包括键盘
我正在寻找正确的方法来抓拍整个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
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。但是,在屏幕截图中不会看到自定义键盘(如快捷键)。该窗口不在您的进程中。