2014-11-10 3 views
4

Я пытаюсь захватить снимок экрана WKWebView, но мой метод не работает должным образом, он возвращает сплошной цвет, как если бы дерево слоев было пустым, в то время как кажется, что работать над другими мнениями.Я не могу захватить снимок экрана WKWebView

- (UIImage *)screenshot 
{ 
    UIImage *screenshot; 

    UIGraphicsBeginImageContext(self.frame.size); 

    [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    screenshot = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return screenshot; 
} 
+0

Вы нашли решение для iOS? В настоящее время я использую snapshotViewAfterScreenUpdates. Но я должен вызвать его после отображения веб-представления, поэтому я жду 0.1 секунд в файле didFinishNavigation и вызове snapshotViewAfterScreenUpdates. Не очень удобно и надежно ( – sidslog

+0

Столкнулась с той же проблемой с видеозаписью WKWebView. Его просто белый квадрат, в то время как UIWebView записывается правильно. Пока не найдено ни одного решения – Dren

+1

FYI, renderInContext работает на iOS 10 и в симуляторе на iOS 9, но не устройства с iOS 9. Будьте осторожны с вашим тестированием. – delrox

ответ

3

Этот Stackoverflow answer решил это для меня на 8 прошивкой с WKWebView где [view snapshotViewAfterScreenUpdates:] и [view.layer renderInContext:] либо возвращается сплошной черный или белый:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0); 
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; 
UIImage* uiImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+1

Стоит обратить внимание на возвращаемое значение 'drawViewHierarchyInRect: afterScreenUpdates:' хотя. Если вы пытаетесь отобразить все содержимое WKWebView, временно изменив размер представления перед вызовом этого метода, я обнаружил, что метод возвращает NO, указывая, что не весь контент был нарисован, и это отображается как серые области в результирующий UIImage. – user2067021

-1

Попробуйте

- (IBAction)takeScreenShot:(id)sender { 

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
CGRect rect = [keyWindow bounds]; 
UIGraphicsBeginImageContext(rect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[keyWindow.layer renderInContext:context]; 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

UIImageWriteToSavedPhotosAlbum(img, self, 
           @selector(image:didFinishSavingWithError:contextInfo:), nil); 

} 

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error 
    contextInfo:(void *)contextInfo 
{ 
// Was there an error? 
if (error != NULL) 
{ 
    // Show error message... 
    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Image not Saved" message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [alertView show]; 
} 
else // No errors 
{ 
    // Show message image successfully saved 
    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Image Saved" message:@"This chart has been save to your photos" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [alertView show]; 
} 
} 
+0

Nup, все еще не работает. Я получаю точно такое же изображение на скриншоте, где должен быть WKWebView. В дереве слоев WKWebView существует только цвет фона веб-страницы – Vulkan

+0

Если есть какие-либо ошибки? –

+0

Нет ошибки, потому что в этом процессе ничего не получилось. Слои просто не отображаются в веб-браузере. Уровни веб-представления имеют только 1 слой. Фоновый слой. Вот и все ... ОГРОМНЫЙ БУГ! – Vulkan

3

Там еще ошибка с WKWebView, но вы можете работать ваш путь вокруг него, используя другую функцию:

[webView snapshotViewAfterScreenUpdates:NO or YES]; 

Он работает.

0

Метод drawViewHierarchyInRect будет работать, но будет вызывать экран для кратковременной вспышки.

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

0

Вот мои два очка. Перед тем, как iOS 10.3.1 renderInContext хорошо работал для WKWebView. Но только если WKWebView включен в представленную иерархию представлений. Другими словами, система рисует его на экране.

В iOS 10.3.1, renderInContext не работает для меня. В тот же момент drawViewHierarchyInRect отлично работает в iOS 10.3.1. Но только если это в иерархии представлений! Еще хуже. Когда я пытался получить снимок WKWebView, который не был представлен на текущем экране, исходное представление стало недействительным. Таким образом, снятие скриншота может нарушить WKWebView.

Вот мое обходное решение.

  1. Я сохранить снимок (UIImage) с drawViewHierarchyInRect каждый раз, когда мне это нужно. Но только если WKWebView находится на экране.
  2. Если WKWebView отсутствует в иерархии представлений, я использую сохраненный снимок.