2015-01-27 2 views
3

Я ищу подходящий способ сделать снимок всего экрана iPhone, включая клавиатуру.Снимок 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-интерфейсы моментальных снимков.

Любые идеи для этого и с наилучшей производительностью?

ответ

2

Вы правы, клавиатура отображается в другом окне. Поэтому вместо того, чтобы получать только одно окно, используя [[UIApplication sharedApplication] keyWindow], вы должны получить все окна, используя [[UIApplication sharedApplication] windows], и для каждого из них вызовите [viewWhereYouWantToScreenCapture drawViewHierarchyInRect:screenCaptureRect afterScreenUpdates:NO], чтобы все они были нарисованы внутри одного контекста изображения.

1

iOS отображает клавиатуру под окном с описанием UITextEffectsWindow.

Вы можете перебирать все окна с помощью и найти правильный с помощью:

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

Когда вы закончите, вы можете сделать его в контексте с помощью renderInContext или drawViewHierarchyInRect. renderInContext может быть медленнее, но безопаснее (потому что это делается на основном потоке), а drawViewHierarchyInRect быстрее (не влияет на основной поток), но может произойти сбой из-за ошибки в коде iOS.

+0

является это с помощью собственной API? – matteok

+0

Снимок экрана с клавиатуры не использует частный api. Однако на скриншоте вы не увидите пользовательскую клавиатуру (например, Swiftkey). Окно не из вашего процесса. – gilm

7

Клавиатура расположена в другом окне. И в аксессуарах для клавиатуры 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; 
} 
Смежные вопросы