删除UIWebView Shadow?

时间:2009-07-02 13:25:05

标签: iphone uiwebview shadow

有没有人知道是否可以删除放置在UIWebView窗口上的阴影?

示例:http://uploadingit.com/files/1173105_olub5/shadow.png

如果可能,你怎么做?

由于

15 个答案:

答案 0 :(得分:71)

这是“Nikolai Krill”解决方案的更清洁的替代品。这只隐藏UIWebView中的UIImageViews而不是UIWebBrowserView。

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

由于 詹姆斯

答案 1 :(得分:14)

答案 2 :(得分:5)

有一个带有选择器setAllowsRubberBanding的私有方法:它接受BOOL值。如果传递否,您将无法滚动内容区域顶部或底部的Web视图,但仍然可以正常滚动Web视图。不幸的是,这种方法是私有的,如果您使用它,您的应用可能不会被允许进入商店。

但是,您可以使用Objective-C运行时的动态特性,尝试提取方法实现并将其绑定到您创建的不同选择器。

但是,该方法是私有的,在操作系统的未来版本中可能不再存在。如果你还想尝试,这里有一些示例代码将提取setAllowsRubberBanding:方法实现并为你调用它。

static inline void ShhhDoNotTellAppleAboutThis (UIWebView *webview)
{
    const char *hax3d = "frgNyybjfEhooreOnaqvat";
    char appleSelName[24];

    for (int i = 0; i < 22; ++i)
    {
        char c = hax3d[i];
        appleSelName[i] = (c >= 'a' && c <= 'z') ? ((c - 'a' + 13) % 26) + 'a' : ((c - 'A' + 13) % 26) + 'A';
    }
    appleSelName[22] = ':';
    appleSelName[23] = 0;

    SEL appleSEL = sel_getUid(appleSelName);

    UIScrollView *scrollView = (UIScrollView *)[webview.subviews objectAtIndex:0];
    Class cls = [scrollView class];
    if (class_respondsToSelector(cls, appleSEL) == NO)
    {
        return;
    }

    IMP func = class_getMethodImplementation(cls, appleSEL);
    func(scrollView, appleSEL, NO);
}

请注意,如果您选择使用此代码将应用程序提交到AppStore,这可能仍会被Apple的静态分析器捕获。

答案 3 :(得分:4)

这可以在不使用私有API的情况下完成。您需要做的就是隐藏每个UIImageView中的阴影。下面是代码:

for (int x = 0; x < 10; ++x) {
    [[[[[webView subviews] objectAtIndex:0] subviews] objectAtIndex:x] setHidden:YES];
}

答案 4 :(得分:4)

这是一个Swift函数,可以摆脱iOS 9中UIWebView中的阴影。它比我在SO上看到的任何替代版本更安全,因为它中的所有内容都在Apple文档中,并且它特别改变了shadow属性(如反对隐藏整个视图或视图的其他属性。)

func removeShadow(webView: UIWebView) {
    for subview:UIView in webView.scrollView.subviews {
        subview.layer.shadowOpacity = 0
        for subsubview in subview.subviews {
            subsubview.layer.shadowOpacity = 0
        }
    }
}

您始终可以访问UIViewdocumentation)的子视图属性。每个UIView都有一个layer属性CALayerdocumentation)。每个CALayer都有shadowOpacitydocumentation)。

注意事项:

  1. 根据您的具体情况,您可能需要更深入地通过子视图导航视图层次结构。
  2. 只要您不希望Web视图控制器中的任何位置出现任何阴影,此操作就可以正常工作。如果您有一个想要保留阴影的视图(默认的UIWebView阴影除外),那么您可以添加一个if-check来标识该视图,而不是将该视图的图层shadowOpacity设置为零。
  3. 根据Apple“对于在UIKit和其他系统框架中声明的复杂视图,视图的任何子视图通常被视为私有,并且可能随时更改。因此,您不应尝试检索或修改这些类型的系统提供的视图的子视图。如果这样做,您的代码可能会在将来的系统更新期间中断“。 。 。换句话说,UIWebView可以更改,不建议将其挖掘到这些子视图中。但是,挖掘UIWebView是摆脱阴影的唯一方法,这是一种相对安全的方法。

答案 5 :(得分:2)

遍历所有子视图,图像宽度仅为1像素的UIImageViews是阴影图像,您可以隐藏它们。

- (void)hideShadows {
    [webview traverseViewsWithBlock:^(UIView *view) {
        UIImageView *imgView = ([view isKindOfClass:[UIImageView class]] ? (UIImageView*)view : nil;
        // image views whose image is 1px wide are shadow images, hide them
        if (imgView && imgView.image.size.width == 1) {
            imgView.hidden = YES;
        }
    }];
}

traverseViewsWithBlock执行它的样子:

- (void)traverseViewsWithBlock:(void (^)(UIView* view))block
{
    block(self);
    for (id subview in self.subviews) {
        [subview traverseViewsWithBlock:block];
    }
}

答案 6 :(得分:2)

试试这个

func webViewDidFinishLoad(_ webView: UIWebView) {
    for shadowView in self.webView.scrollView.subviews {
        if !shadowView.isKind(of: UIImageView.self) {
            shadowView.subviews[0].layer.shadowColor = UIColor.clear.cgColor
        } else {
            shadowView.layer.shadowColor = UIColor.clear.cgColor
        }
    }
}

答案 7 :(得分:1)

我查看了课程属性并没有找到任何内容,但我可以想到两个“掩盖”策略:

1。您可以使用其他视图(Web视图的父视图)剪辑webview范围。
2。您可以在webview顶部添加另一个视图以覆盖所需区域,其颜色与背景相匹配,您可以使用中心有透明区域的uiimage。

顺便说一句,我不喜欢这种表格视图的标准背景:P,但改变它可能是一个痛苦的屁股:P

答案 8 :(得分:1)

你必须要小心,滚动指示器也是UIImageViews。 我会改进我的代码,但这是一个基本的子类解决方案:

http://forrst.com/posts/A_tiny_UIWebView_hack_remove_shadows_from_behi-gzH

答案 9 :(得分:1)

隐藏滚动指示符并在UIWebView

中透明网页视图here 的最简单方法

删除卷轴。

    for(UIView *view in webView.subviews){   
         if ([view isKindOfClass:[UIScrollView class]]) {  
              UIScrollView *sView = (UIScrollView *)view;  
              //to hide verticalScroller  
              sView.showsVerticalScrollIndicator = NO;
              sView.showsVerticalScrollIndicator = NO;
         }   
    }  

答案 10 :(得分:1)

UIWebView上的类别怎么样:

- (BOOL)showsScrollShadows
{
    for(UIImageView *imageView in [self imageViewsWithShadows])
    {
        if(imageView.hidden)
        {
            return NO;
        }

        break;
    }

    return YES;
}

- (void)setShowsScrollShadows:(BOOL)showsScrollShadows
{
    [[self imageViewsWithShadows] makeObjectsPerformSelector:@selector(setHidden:) withObject:@(!showsScrollShadows)];
}

- (NSArray *)imageViewsWithShadows
{
    NSArray *potentialShadowImageViews = (self.subviews.count > 0) ? [self.subviews[0] subviews] : nil;

    if(potentialShadowImageViews.count > 0)
    {
        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings)
        {
            return [evaluatedObject isKindOfClass:[UIImageView class]];
        }];

        return [potentialShadowImageViews filteredArrayUsingPredicate:predicate];
    }

    return nil;
}

答案 11 :(得分:0)

我环顾四周,看不到与之相关的任何内容。除了用视图掩盖它或以某种方式剪切它之外,我唯一能想到的是遍历所有UIWebView子视图(和子子视图等),看看你是否能看到任何东西!

答案 12 :(得分:0)

我可能错了,但我认为只有在我们滚动webview时才会显示阴影吗? 在这种情况下,你想阻止滚动还是真的隐藏阴影?我不知道任何隐藏阴影的提示。要禁用滚动,我将setUserInteractionEnabled设置为NO。

答案 13 :(得分:0)

我添加了一个递归方法作为UIView对象的类别,以便它将对方法的接收视图的子视图进行深度优先遍历,隐藏它找到的任何UIImageView子类。如果没有子视图,它不会崩溃。 -apply:方法来自BlocksKit。您可以重写此函数不使用它,但该块并行应用于接收数组的每个元素,因此它非常快。

@implementation UIView (RemoveShadow)

- (void)removeShadow {
  if (self.subviews.count == 0 && [self isKindOfClass:[UIImageView class]]) {
    self.hidden = YES;
  } else if (self.subviews.count > 0) {
    [self.subviews apply:^(id sender) {
      [(UIView *)sender removeShadow];
    }];
  }
}

@end

答案 14 :(得分: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;