Содержимое UIWebView не настроено на новый кадр после вращения

У меня есть приложение для электронной почты,
который показывает содержимое в UIWebView внутри UISplitViewController.
Все работает нормально, пока я не повернул устройство, когда оно уже увеличилось/уменьшилось в UIWebView. При вращении устройства я настраиваю рамку UIWebView на странице

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

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

Дополнительная информация: UIWebView является подвью на UIScrollView, который можно прокручивать. Когда UIWebView полностью виден, scrollEnabled UIScrollView отключен, а прокрутка UIWebView.

Landscape_Correct Над изображением на экране отображается UIWebView в альбомной ориентации. Это состояние перед вращением в обоих случаях.


Portrait_Without_Zooming
[Не увеличено до поворота] Над изображением показано, что UIWebView правильно изменяет размер содержимого на новый кадр.


Portrait_With_Zooming
[Увеличение до поворота] Над изображением отображается UIWebView после изменения пейзажа, а затем поворот на портрет - > Неверное отображение содержимого

Информация о UIWebView.scrollView в
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation:

<_UIWebViewScrollView: 0xb1322a0; frame = (0 0; 768 960); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0xb1321d0>; layer = <CALayer: 0xb132270>; contentOffset: {0, 0}> кадр правильный!

Изменить: Решение!
мне удалось решить эту проблему, обновив ширину окна просмотра после поворота устройства

CGFloat fll_width = self.view.frame.size.width; NSString* adsl_javascript_string = [NSString stringWithFormat:@"var setViewPortScript = document.createElement('meta');\ setViewPortScript.setAttribute('name', 'viewport');\ setViewPortScript.setAttribute('content', 'width = %f');\ document.getElementsByTagName('head')[0].appendChild(setViewPortScript);", fll_width]; [adsc_webview stringByEvaluatingJavaScriptFromString:adsl_javascript_string];

Ответ 1

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

CGFloat fll_width = self.view.frame.size.width;
NSString* adsl_javascript_string = [NSString stringWithFormat:@"var setViewPortScript = document.createElement('meta');\
     setViewPortScript.setAttribute('name', 'viewport');\
     setViewPortScript.setAttribute('content', 'width = %f');\
     document.getElementsByTagName('head')[0].appendChild(setViewPortScript);", fll_width];
[adsc_webview stringByEvaluatingJavaScriptFromString:adsl_javascript_string];

Ответ 2

Это похоже на ошибку также в iOS 7 и iOS 8. Исправление будет следующим:

Сначала измените размер кадра на изменения макета:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    _webView.frame = self.view.bounds;
}

Затем на обратном вызове вращения reset zoomScale на 0. Да, 0!

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    // Allow the animation to complete
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [_webView.scrollView setZoomScale:0 animated:YES];
    });
}

Вы также можете использовать новую функцию

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    // Allow the animation to complete
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [_webView.scrollView setZoomScale:0 animated:YES];
    });
}