透明UINavigationBar下的UIWebView
Posted
技术标签:
【中文标题】透明UINavigationBar下的UIWebView【英文标题】:UIWebView under transparent UINavigationBar 【发布时间】:2009-09-16 07:34:41 【问题描述】:我有一个 UIWebView,我想将它放在我的半透明 UINavigationBar 下。通常,当我将 UIScrollView 放在半透明的 UINavigationBar 下时,我会设置它的 contentOffset 以便所有内容最初都会在 bar 之后被推送,以便可以看到它;此后,用户可以滚动文本,它会在栏下方。
问题在于 UIWebView 似乎不是 UIScrollView 的正确子类;因此,我不能使用 setContentOffset。有没有人有任何关于让 UIWebView 使用半透明导航栏看起来不错的提示或技巧?谢谢。
【问题讨论】:
【参考方案1】:从 ios 5 开始,您可以使用 UIWebView 的 scrollView 属性,并设置一个 contentInset 来调整位置。
CGFloat top = 0.0;
if( self.navigationController != nil && self.navigationController.navigationBar.translucent )
top = self.navigationController.navigationBar.bounds.size.height;
UIWebView* wv = ...
wv.scrollView.contentInset = UIEdgeInsetsMake(top, 0.0, 0.0, 0.0);
【讨论】:
我建议在 iOS 5 上使用它。在 iOS 4 的情况下,您可以迭代子视图以找到 isKindOfClass: 为 [UIScrollView 类] 返回 true 的视图。然后只需在此视图上设置 contentInset(转换为 UIScrollView)。 这对我来说似乎是正确的解决方案。【参考方案2】:最简单的方法是设置:
webView.clipsToBounds = NO;
webView.scrollView.clipsToBounds = NO;
它适用于 iOS 7 和 6,我没有尝试,但可能也适用于 iOS 5
【讨论】:
【参考方案3】:我通过将 UIWebView 子视图设置为不裁剪到边界来实现这一点,然后我可以在其顶部放置一个工具栏并获得所需的效果:
for (UIView *subview in theWebView.subviews)
subview.clipsToBounds = NO;
【讨论】:
【参考方案4】:我不确定是否有 clean 方法可以做到这一点。我没有尝试过,但这里有一个想法:
-
在原点 0,0 处绘制 uiwebview
拦截所有屏幕触摸
如果您检测到用户向上拖动(向上滚动 web 视图),请不要传递触摸
相反,将 webview 向上移动 x 个像素,使其原点为 (0,-x)。然后更改高度以添加 x 个像素
您需要保持某种状态,以便知道何时停止调整 webview 的大小并开始传递触摸,以便 webview 滚动。
将其取回与您在向下拖动(向下滚动 web 视图)时执行此操作相同。
【讨论】:
“不要将触摸传递给 uiwebview”部分你是怎么做的? 这可能不是实现这一目标的最简单方法,尤其是如果您的目标是 iOS 5+(UIWebView scrollView.contentInset 干净利落地完成了这一点)。查看 zerotool 的答案。对于 iOS 4,您可以迭代 UIWebview 子视图以可靠地访问相同的 UIScrollView。 这是一个非常非常古老的q和a【参考方案5】:另一种可能的方法是在您正在呈现的 html 代码中插入一个 div,以便它在页面顶部隔开。确保正确设置缩放并将 uiwebviews 原点设置为 (0, -x)。
【讨论】:
【参考方案6】:随着 iOS 7 的出现,偏移高度现在需要包括顶部状态区域的高度。否则,iOS7 设备的导航栏下仍有 20 像素的 webview 隐藏。
在一个需要支持 iOS 7 和更旧设备的项目中,找到一个类似的宏 here:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
可能非常有用。 上面列出的 zerotool 有用代码的修改版本现在看起来像这样:
if (self.navigationController != nil && self.navigationController.navigationBar.translucent)
top = self.navigationController.navigationBar.bounds.size.height;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
top += [[UIScreen mainScreen] applicationFrame].origin.y;
// (etc.)
【讨论】:
以上是关于透明UINavigationBar下的UIWebView的主要内容,如果未能解决你的问题,请参考以下文章
UISearchController 不能与非半透明 UINavigationBar 一起正常工作