从 UIWebView 中删除渐变背景?

Posted

技术标签:

【中文标题】从 UIWebView 中删除渐变背景?【英文标题】:Remove gradient background from UIWebView? 【发布时间】:2010-06-09 19:12:26 【问题描述】:

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

webView.backgroundColor = [UIColor whiteColor];

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

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

【问题讨论】:

我也想知道这一点,因为这会使弹跳在 UIWebView 中看起来不错... 是的,这很烦人,我也对解决方案感兴趣 Remove UIWebView Shadow?的可能重复 【参考方案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;

【讨论】:

以上是关于从 UIWebView 中删除渐变背景?的主要内容,如果未能解决你的问题,请参考以下文章

从扫描图像中去除背景渐变

从中心/中间的线性渐变背景

从线性渐变颜色值获取背景颜色

jQuery动画div背景颜色渐变?

CSS3实现渐变背景

如何CSS实现网页背景三种颜色渐变效果?