从UIWebView中移除渐变背景?

36

如何从UIWebView中删除渐变效果-即在顶部或底部超出滚动区域时看到的效果。

这段代码

webView.backgroundColor = [UIColor whiteColor];

只是改变了渐变的颜色,而没有移除它。如何才能实现移除?

(注意:这个问题与UIWebView underside不同)


1
我也想找出这个问题的答案,因为这将使UIWebView中的反弹效果更加美观。 - Dan J
是的,这很烦人,我也对解决方案感兴趣。 - MrCranky
可能是Remove UIWebView Shadow?的重复问题。 - JosephH
8个回答

82
啊哈,是的,术语误解了。我不会称其为阴影,但这就是生活。以下是我的类型安全代码来实现该效果。简要概括一下:这将隐藏滚动视图的任何图像查看器子项。它不像(objectAtIndex:0)方法那样容易受到更改的影响,因此如果苹果重新排序webView控件的子项,它将正常工作,但仍然依赖于通过图像视图父级应用渐变效果的事实(并且确实有底层支持webView的scrollView)。
{
    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];
                }
            }
        }
    }
}

3
你不会称它为阴影吗?当然,它是通过绘制渐变来实现的,但其目的是使Web视图看起来浮在背景上。所以我仍然会称之为阴影 :-) - Brian
这很公平。 :-) 奖励悬赏以链接问题,尽管这个问题可能应该被关闭为重复。 - MrCranky
3
仍然有效(6.1版本),但我发现设置backgroundColor不是必需的。另外,现在我们可以访问webView.scrollView,因此我们可以重写为:for (UIView *shadowView in [webView.scrollView subviews]) { if ([shadowView isKindOfClass:[UIImageView class]]) { [shadowView setHidden:YES]; } } - levigroker

3
为了使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];
                }
           }
      }
 }

隐藏滚动条指示器的方法如下


请记得确保包含网页视图的任何superview也是透明的 :) 然后这个脚本就会对你起作用。 - hfossli

2

1
我发现唯一的方法是:
for(UIView *aView in [[[webView subviews] objectAtIndex:0] subviews]) { 
        if([aView isKindOfClass:[UIImageView class]]) { aView.hidden = YES; } 
}

它只是遍历UIWebView的子视图,并在其为图像视图时删除该视图。

我还没有将其放入任何App Store应用程序中,因此我不知道苹果是否会接受它。

编辑:Brian的链接提供了更多细节。


0

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

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

0

我在 @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

0
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;

0

我通过在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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接