views:

1760

answers:

9

Does anyone know if its possible to remove the shadow that is placed on the UIWebView window?

Example: http://uploadingit.com/files/1173105_olub5/shadow.png

If its possible how do you do it?

Thanks

A: 

I looked at the class properties and didn't find anything there but I can think of two "cover up" strategies:

1. You can use another view (parent of the web view) to clip the webview bounds.
2. You can add another view on top of the webview to cover the needed area with a color that matches the background, you can use an uiimage with a transparent area in the center.

By the way I don't like this standard background of the table views :P, but changing it can be a pain in the ass :P

A: 

I've had a look around and can't see anything related to it. Apart from masking it with a view or clipping it somehow, the only thing I can think of is to loop through all of the UIWebView subviews (and sub-subviews etc.) and see if you can see anything there!

Michael Waterfall
A: 

I may be wrong, but I think the shadow only shows up when we scroll the webview doesn't it ? In that case, do you want to prevent the scrolling or really hide the shadow ? I don't know any tips that would hide the shadow. To disable the scrolling, I would setUserInteractionEnabled to NO.

Unfalkster
+1  A: 

There is a private method with the selector setAllowsRubberBanding: that takes a BOOL value. If passed NO, you will not be able to scroll the web view past the top or bottom of the content area, but will still let you scroll through the web view normally. Unfortunately, this method IS private, and your app will likely not be allowed onto the store if you use it.

You could, however, potentially try and extract the method implementation and bind it to a different selector that you've created, using the dynamic nature of Objective-C's runtime.

Still, the method is private and may no longer exist in future versions of the OS. If you still want to try, here's some sample code that will extract the setAllowsRubberBanding: method implementation and call it for you.

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);
}

Please note that this will probably still get caught by Apple's static analyzer if you choose to submit an app using this code to the AppStore.

PfhorSlayer
A: 

Hello, What's hax3d code ? is this allowed by appstore ? can I still use this for other private method ? Thank you

xicoras
+4  A: 

This can be done without use of private APIs. All you need to do is hide each UIImageView with the shadow in it. Heres the code:

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

Nikolai Krill
This worked for me. Thanks!
Michael Grinich
This could crash if there a no subviews
parceval
This works for us here thanks! However, what if Apple's code changes? What bugs me is that if you want formatted text, you are recommended to use the UIWebView... But a UIWebView doesn't look the same!
Joe
+1  A: 

the small for loop is very dangerous because it can crash if apple changes the number of the subviews.

this way it does at least not crash when something changes:

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];
}

denis2342

denis2342
It does crash when Apple decides to put zero subviews in the UIWebView.
Nikolai Ruhe
ok, I put another check around it, happy now? ;)
denis2342
+4  A: 

This is a cleaner alternative to "Nikolai Krill" solution. This only hides UIImageViews within the UIWebView and not the UIWebBrowserView.

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

Thanks James


via @joe wibble.

jodm
Did someone already pass this through the appStore validation process ?
F.Santoni
Yes, an application I created uses this code and went through the validation process first time on Monday.
jodm
A: 

Hey thanks this was very helpfull..

santosh j