在iOS 11中,UIWebView会按状态栏弹出。它可能会受到iOS 11引入的安全区域插入的影响。我尝试将属性contentInsetAdjustmentBehavior设置如下:
webView.scrollowView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways
有效。但是,对于某些使用-webkit-overflow-scrolling的页面,webView.scrollowView将另一个UIScrollowView(UIWebOverflowScrollView)作为其子视图。如果我没有为该scrollView设置属性contentInsetAdjustmentBehavior,则页面元素将下沉。如果没有为UIWebview的所有scrollView设置属性contentInsetAdjustmentBehavior,则针对此问题的任何其他解决方案。
答案 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)
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);
}