从 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
是否足够。您可能需要将其放在包含您的UIWebView
的UIViewController
中,以便在旋转后调整封面大小:
- (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 中删除渐变背景?的主要内容,如果未能解决你的问题,请参考以下文章