透明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的主要内容,如果未能解决你的问题,请参考以下文章

使 UINavigationBar 透明

使 UINavigationBar 半透明

UISearchController 不能与非半透明 UINavigationBar 一起正常工作

如何使 UINavigationBar 背景透明?

UINavigationBar 显示为半透明而不是不透明的白色

UINavigationBar isTranslucent false 但保持透明