我正在寻找合适的方式来拍摄整个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。
有任何想法,并以最佳表现?
答案 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;
}
}
完成后,您可以使用renderInContext
或drawViewHierarchyInRect
将其渲染到您的上下文中。 renderInContext
可能更慢但更安全(因为它在主线程上完成)并且drawViewHierarchyInRect
更快(不会影响主线程),但可能会因为a而崩溃iOS代码中的错误。