【问题标题】:UIWebView under transparent UINavigationBar透明UINavigationBar下的UIWebView
【发布时间】:2009-09-16 07:34:41
【问题描述】:

我有一个 UIWebView,我想将它放在我的半透明 UINavigationBar 下。通常,当我将 UIScrollView 放在半透明的 UINavigationBar 下时,我会设置它的 contentOffset 以便所有内容最初都会在 bar 之后被推送,以便可以看到它;此后,用户可以滚动文本,它会在栏下方。

问题在于 UIWebView 似乎不是 UIScrollView 的正确子类;因此,我不能使用 setContentOffset。有没有人有任何关于让 UIWebView 使用半透明导航栏看起来不错的提示或技巧?谢谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案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 方法可以做到这一点。我没有尝试过,但这里有一个想法:

        1. 在原点 0,0 处绘制 uiwebview
        2. 拦截所有屏幕触摸
        3. 如果您检测到用户向上拖动(向上滚动 web 视图),请不要传递触摸
        4. 相反,将 webview 向上移动 x 个像素,使其原点为 (0,-x)。然后更改高度以添加 x 个像素
        5. 您需要保持某种状态,以便知道何时停止调整 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.)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-05
            • 2011-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多