删除UIWebView Shadow?

31 iphone shadow uiwebview

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

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

如果它可能你怎么做?

谢谢

jod*_*odm 71

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

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

谢谢詹姆斯

  • 要保留滚动条指示符,请使用以下代码:`if([wview isKindOfClass:[UIImageView class]] && wview.frame.size.width!= 7){wview.hidden = YES; 在这个答案中,而不是if语句. (4认同)

den*_*342 14

小的for循环是非常危险的,因为如果苹果改变子视图的数量它会崩溃.

这样一来,当事情发生变化时,它至少不会崩溃:

if ([[webView subviews] count] > 0)
{
    for (UIView* shadowView in [[[webView subviews] objectAtIndex:0] subviews])
    {
        [shadowView setHidden:YES];
    }

    // unhide the last view so it is visible again because it has the content
    [[[[[webView subviews] objectAtIndex:0] subviews] lastObject] setHidden:NO];
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我再试一下它,现在开心吗?;) (4认同)

Pfh*_*yer 5

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

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

但是,该方法是私有的,并且可能在OS的未来版本中不再存在.如果你还想尝试,这里有一些示例代码将提取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);
}
Run Code Online (Sandbox Code Playgroud)

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


dev*_*ney 5

这是一个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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您始终可以访问UIViewdocumentation)的subviews属性。每个UIView都有一个(文档layer属性。每个都有(文档)。CALayerCALayershadowOpacity

注意事项:

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


use*_*806 1

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

1.您可以使用另一个视图(Web 视图的父级)来裁剪 Web 视图边界。
2.您可以在webview之上添加另一个视图,用与背景相匹配的颜色覆盖所需的区域,您可以使用中心有透明区域的uiimage。

顺便说一句,我不喜欢表视图的标准背景:P,但更改它可能会很痛苦:P