【问题标题】:Remove gradient background from UIWebView?从 UIWebView 中删除渐变背景?
【发布时间】:2011-03-01 20:17:09
【问题描述】:

如何从 UIWebView 中移除渐变 - 如果您过度滚动顶部或底部,您会看到渐变。 这段代码

webView.backgroundColor = [UIColor whiteColor];

只是改变渐变的颜色,并不会移除它。如何做到这一点?

(注意:和UIWebView underside不是同一个问题)

【问题讨论】:

  • 我也想知道这一点,因为这会使 UIWebView 中的反弹看起来不错...
  • 是的,这很烦人,我也对解决方案感兴趣
  • Remove UIWebView Shadow?的可能重复

标签: ios iphone uiwebview


【解决方案1】:

啊哈,是的,术语失败了。我根本不会称它为影子,但 c'est la vie。这是我实现效果的类型安全代码。总结一下:这将隐藏滚动视图的任何图像视图子项。它不像 (objectAtIndex:0) 方法那样容易更改,因此如果 Apple 重新排序 webView 控件的子项,它将正常工作,但仍然依赖于渐变效果由父级到滚动的图像视图应用的事实视图(并且确实有一个支持 Web 视图的滚动视图)。

{
    webView.backgroundColor = [UIColor whiteColor];
    for (UIView* subView in [webView subviews])
    {
        if ([subView isKindOfClass:[UIScrollView class]]) {
            for (UIView* shadowView in [subView subviews])
            {
                if ([shadowView isKindOfClass:[UIImageView class]]) {
                    [shadowView setHidden:YES];
                }
            }
        }
    }
}

【讨论】:

  • 你不会称它为影子吧?当然它是通过绘制渐变来实现的,但目的是让 webview 看起来漂浮在背景上。所以我还是会称它为影子:-)
  • 这很公平。 :-) 因链接问题而获得赏金,尽管这个问题是否应该作为副本关闭?
  • 仍然有效(6.1),但我发现没有必要设置 backgroundColor。另外,现在我们可以访问 webView.scrollView 我们可以重写为: for (UIView *shadowView in [webView.scrollView subviews]) { if ([shadowView isKindOfClass:[UIImageView class]]) { [shadowView setHidden:YES] ; } }
【解决方案2】:

透明 UIWebView 并移除滚动条。

 webView.opaque = NO;
 webView.backgroundColor = [UIColor clearColor];
 for(UIView *view in webView.subviews){      
      if ([view isKindOfClass:[UIImageView class]]) {
           // to transparent 
           [view removeFromSuperview];
      }
      if ([view isKindOfClass:[UIScrollView class]]) {
           UIScrollView *sView = (UIScrollView *)view;
           for (UIView* shadowView in [sView subviews]){
                //to remove shadow
                if ([shadowView isKindOfClass:[UIImageView class]]) {
                     [shadowView setHidden:YES];
                }
           }
      }
 }

hide scroll indicators

【讨论】:

  • 记住要确保 webview 的任何 superview 也是透明的 :) 那么这个脚本会为你工作
【解决方案3】:

你是说影子? Remove UIWebView Shadow?

【讨论】:

    【解决方案4】:

    我发现如何做到这一点的唯一方法是:

    for(UIView *aView in [[[webView subviews] objectAtIndex:0] subviews]) { 
            if([aView isKindOfClass:[UIImageView class]]) { aView.hidden = YES; } 
    }
    

    它只是通过 UIWebView 的子视图,如果它是图像视图,则删除视图。

    我还没有把它放在任何 App Store 应用程序中,所以我不知道 Apple 是否会接受它。

    编辑:Brian 的链接提供了更多详细信息。

    【讨论】:

      【解决方案5】:

      使用上面建议的方法,您以后将无法编辑滚动指示器/插图。它们也显示为 UIImageView,因此您应该检查最后一个对象:

                  UIView* lastView = [[subView subviews] lastObject];
                  for (UIView* shadowView in [subView subviews])
                  { 
                      if(shadowView!=lastView) ... <-this one is a scroll 
                  }
      

      【讨论】:

        【解决方案6】:

        我可以通过在 WebView 的 scrollView 的顶部和底部添加白色子视图来做到这一点。我控制 WebView 的内容,所以我知道白色是可以的 - 如果你正在加载任意内容,这将不起作用。

        // _topCover and _bottomCover are ivar UIViews
        - (void)webViewDidFinishLoad:(UIWebView *)webView
        {
            // with cover views 300pt high, I couldn't scroll far enough to see the shadow,
            // even in portrait on an iPad, which gives you the longest scroll distance
            CGFloat coverage = 300;
        
            _topCover = [[UIView alloc] initWithFrame:CGRectMake(0, -coverage, webView.bounds.size.width, coverage)];
            _bottomCover = [[UIView alloc] initWithFrame:CGRectMake(0, webView.scrollView.contentSize.height, webView.bounds.size.width, coverage)];
            _topCover.backgroundColor = [UIColor whiteColor];
            _bottomCover.backgroundColor = [UIColor whiteColor];
        
            // in case the webView is resized, e.g. by rotating the device
            _topCover.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
            _bottomCover.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
        
            [webView.scrollView addSubview:_topCover];
            [webView.scrollView addSubview:_bottomCover];
        }
        

        我在页面加载后运行它,以便webView.scrollView.contentSize.height 会给我正确的高度。如果您的页面动态改变高度,我不确定这将如何工作。我的页面只加载一次;如果您正在重新加载,您将希望在第一次之后跳过在 _topCover_bottomCover 上运行 alloc/init 以提高效率。

        更新:当视图旋转时,我不确定我使用上面的autoresizingMask 是否足够。您可能需要将其放在包含您的UIWebViewUIViewController 中,以便在旋转后调整封面大小:

        - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
        {        
            CGFloat coverage = 300;
            _topCover.frame = CGRectMake(0, -coverage, self.webView.bounds.size.width, coverage);
            _bottomCover.frame = CGRectMake(0, self.webView.scrollView.contentSize.height, self.webView.bounds.size.width, coverage);
        }
        

        【讨论】:

          【解决方案7】:

          我已经建立在 @damithH 的答案之上

          @implementation UIWebView (Extensions)
          
          - (void)setBackgroundAndShadowVisible:(BOOL)visible
          {
              self.opaque = !visible;
              self.backgroundColor = [self.backgroundColor colorWithAlphaComponent:visible ? 1.0 : 0.0];
              for(UIView *view in [self subviews])
              {
                  if([view isKindOfClass:[UIImageView class]])
                  {
                      view.hidden = !visible;
                  }
                  if([view isKindOfClass:[UIScrollView class]])
                  {
                      UIScrollView *scrollView = (UIScrollView *)view;
                      for (UIView *shadowView in [scrollView subviews])
                      {
                          if ([shadowView isKindOfClass:[UIImageView class]])
                          {
                              shadowView.hidden = !visible;
                          }
                      }
                  }
              }
          }
          
          @end
          

          【讨论】:

            【解决方案8】:
            if (UIDevice.currentDevice.systemVersion.intValue < 7)
                for (UIImageView *imageView in webView.scrollView.subviews)
                    if ([imageView isKindOfClass:[UIImageView class]] && imageView.image.size.width == 1)
                        imageView.hidden = YES;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多