iOS 11 UIWebView按状态栏弹出

时间:2017-08-13 16:15:04

标签: uiscrollview uiwebview uistatusbar ios11

在iOS 11中,UIWebView会按状态栏弹出。它可能会受到iOS 11引入的安全区域插入的影响。我尝试将属性contentInsetAdjustmentBehavior设置如下:

webView.scrollowView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways

有效。但是,对于某些使用-webkit-overflow-scrolling的页面,webView.scrollowView将另一个UIScrollowView(UIWebOverflowScrollView)作为其子视图。如果我没有为该scrollView设置属性contentInsetAdjustmentBehavior,则页面元素将下沉。如果没有为UIWebview的所有scrollView设置属性contentInsetAdjustmentBehavior,则针对此问题的任何其他解决方案。

3 个答案:

答案 0 :(得分:15)

实际上,我创建了一个全屏webView,其中navigationBar已隐藏,但statusBar未隐藏。 对于WKWebView,Apple已经修复了自iOS 11 beta 8以来的https://github.com/WebKit/webkit/commit/cb45630904c7655cc3fb41cbf89db9badd1ef601错误,因此我们可以设置wkWebView.scrollview的属性 contentInsetAdjustmentBehavior

wkWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever

对于UIWebView(Apple放弃了UIWebView),我们可以通过设置rootViewController的属性 additionalSafeAreaInsets 来调整UIViewController的安全区域(是的,只有rootViewController的additionalSafeAreaInsets工作):

navigationController.additionalSafeAreaInsets = UIEdgeInsetsMake(-20, 0, 0, 0);

或uiWebView的框架:

uiWebView.frame = CGRectMake(0.0, -20, uiWebView.frame.size.width, uiWebView.frame.size.height + 20);

答案 1 :(得分:3)

如果你想在HTML和CSS中完全处理这个问题,那就有可能。

首先,您需要将viewport-fit=cover添加到视口元标记中,以便WebView填充状态栏后面的整个屏幕空间。

接下来,为了确保您安全地处理iPhone X及其缺口扬声器/相机区域,您需要设置填充以在顶部和底部使用新的CSS安全区域插入常量之一: 即,padding-top: constant(safe-area-inset-top);

我写了一些关于视口的这些更改以及添加的CSS常量等新功能以支持它们的更多内容:https://ayogo.com/blog/ios11-viewport/

答案 2 :(得分:1)

我有类似的问题。我在iOS 11之前设置我的UICollectionView contentInset。

CGFloat topInset = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.frame.size.height;
CGFLoat bottomInset = self.tabBarController.tabBar.frame.size.height;     
self.collectionView.contentInset = UIEdgeInsetsMake(topInset, 0.f, bottomInset, 0.f);

我的修复是这样的(基本上如果iOS 11没有设置contentInsets):

if (![self.collectionView respondsToSelector:NSSelectorFromString(@"contentInsetAdjustmentBehavior")]) 
{
   CGFloat topInset = [UIApplication sharedApplication].statusBarFrame.size.height + self.navigationController.navigationBar.frame.size.height;
   CGFLoat bottomInset = self.tabBarController.tabBar.frame.size.height;     
   self.collectionView.contentInset = UIEdgeInsetsMake(topInset, 0.f, bottomInset, 0.f);
}