2010-06-09 10 views
35

Jak usunąć gradient z UIWebView - ten, który widzisz, jeśli przewyższasz górną lub dolną krawędź. Ten kodUsunąć tło gradientowe z UIWebView?

webView.backgroundColor = [UIColor whiteColor]; 

tylko zmienia kolor gradientu, nie usuwa go. Jak to zrobić?

(uwaga: nie jest to samo pytanie jak UIWebView underside)

+1

chciałbym też to odkryć, ponieważ to sprawi, że odbicie będzie wyglądało ładnie w UIWebView ... –

+0

Tak, to jest najbardziej denerwujące, chciałbym także zainteresować się rozwiązaniem – MrCranky

+0

możliwym duplikatem [Usuń UIWebView Shadow?] (http://stackoverflow.com/questions/1074320/remove-uiwebview-sh adow) – JosephH

Odpowiedz

82

Aha, tak, terminologia się nie udała. Nie nazwałbym tego cieniem, ale c'est la vie. Oto mój bezpieczny dla kodu kod, aby osiągnąć efekt. Podsumowując: spowoduje to ukrycie wszystkich widoków dzieci widoku widoku przewijania. Nie jest tak podatna na zmiany jak metody (objectAtIndex: 0), więc jeśli Apple zmieni kolejność dzieci kontrolki webView, to będzie działało poprawnie, ale nadal będzie polegać na tym, że efekt gradientu jest stosowany przez widoki obrazu zapisane w zwoju view (i że rzeczywiście istnieje widok przewijania leżący u podstaw widoku internetowego).

{ 
    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]; 
       } 
      } 
     } 
    } 
} 
+3

Nie nazwałbyś tego cieniem? Z pewnością implementuje się go poprzez narysowanie gradientu, ale celem jest sprawienie, by widok sieciowy wydawał się unosić w tle. Więc wciąż będę nazywać to cieniem :-) – Brian

+0

To wystarczy. :-) Bounty przyznane za powiązanie pytania, choć czy ten może być zamknięty jako duplikat? – MrCranky

+0

+1 za prawdziwą odpowiedź, która nadal działa 2 lata później. –

1

Jedynym sposobem znalazłem jak to zrobić, to:

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

To po prostu tylko kilka kroków thru subviews z UIWebView i usuwa pogląd, jeśli jest to widok obrazu.

Nie umieszczam tego w aplikacjach App Store, więc nie wiem, czy Apple je zaakceptuje.

EDYCJA: Łącze Briana zawiera więcej szczegółów.

0

Stosując metodę sugerowaną powyżej, nie będzie można później edytować wskaźnika przewijania/wypustek. Pojawiają się one jako UIImageView również, więc należy sprawdzić ostatniego obiektu:

  UIView* lastView = [[subView subviews] lastObject]; 
      for (UIView* shadowView in [subView subviews]) 
      { 
       if(shadowView!=lastView) ... <-this one is a scroll 
      } 
3

Aby przejrzysty UIWebView i usunąć zwoje.

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

dla hide scroll indicators

+0

webView.opaque = NIE; czy ty go używasz ... – damithH

+0

Pamiętaj, aby upewnić się, że każdy podgląd strony internetowej jest również przezroczysty :) Wtedy ten skrypt będzie działał dla ciebie – hfossli

0

udało mi się to zrobić dodając białe subviews na górze i na dole Webview za Scrollview. Kontroluję zawartość WebView, więc wiem, że biały jest OK - to nie zadziała, jeśli ładujesz dowolną zawartość.

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

go uruchomić to po załadowaniu strony tak, że webView.scrollView.contentSize.height da mi prawidłową wysokość. Nie wiem, jak to będzie działać, jeśli strony zmieniają dynamicznie wysokość. Moja strona ładuje się tylko raz; Jeśli twoja jest przeładowaniem, po raz pierwszy dla skuteczności będziesz pomijał uruchamianie alloc/init na _topCover i _bottomCover.

Aktualizacja: nie jestem pewien, że moje użycie autoresizingMask powyżej, jest wystarczająca, gdy widok obraca.Być może trzeba umieścić to w UIViewController który zawiera UIWebView do rozmiaru pokryw po obróceniu:

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

I został zbudowany na @damithH „s odpowiedź

@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 
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;