Содержимое UIWebView не настроено на новый кадр после вращения
У меня есть приложение для электронной почты,
который показывает содержимое в UIWebView
внутри UISplitViewController
.
Все работает нормально, пока я не повернул устройство, когда оно уже увеличилось/уменьшилось в UIWebView
.
При вращении устройства я настраиваю рамку UIWebView
на странице
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Проблема заключается в том, что когда я увеличил/уменьшил масштаб в UIWebView
и затем повернул устройство.
Содержимое не изменяет размер нового кадра, что приводит к тому, что в контенте будет отображаться серая/черная рамка, или содержимое может быть прокручено по горизонтали.
Дополнительная информация:
UIWebView
является подвью на UIScrollView
, который можно прокручивать.
Когда UIWebView
полностью виден, scrollEnabled
UIScrollView
отключен, а прокрутка UIWebView
.
Над изображением на экране отображается 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];
});
}