2010-06-09 15 views
35

Come rimuovere la sfumatura da una UIWebView, quella che si vede se si esegue il trascinamento superiore o inferiore. Questo codiceRimuovere lo sfondo sfumato da UIWebView?

webView.backgroundColor = [UIColor whiteColor]; 

cambia solo il colore della sfumatura, non lo rimuove. Come si può fare?

(nota: non è la stessa domanda UIWebView underside)

+1

vorrei trova anche questo, in quanto ciò renderebbe il rimbalzo piacevole in un UIWebView ... –

+0

Sì, questo è più fastidioso, sarei interessato anche a una soluzione – MrCranky

+0

possibile duplicare di [Rimuovi UIWebView Shadow?] (http://stackoverflow.com/questions/1074320/remove-uiwebview-sh adow) – JosephH

risposta

82

Aha, sì terminologia non riuscita. Non direi affatto un'ombra, ma c'est la vie. Ecco il mio codice di sicurezza del tipo per ottenere l'effetto. Per riassumere: questo nasconderà i bambini vista immagine della vista di scorrimento. Non è così vulnerabile cambiare i metodi (objectAtIndex: 0), quindi se Apple riordina i figli del controllo WebView funzionerà correttamente, ma si basa ancora sul fatto che l'effetto gradiente viene applicato dalle immagini visualizzate sullo schermo vista (e che esiste effettivamente una scrollview che supporta la vista 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]; 
       } 
      } 
     } 
    } 
} 
+3

Non lo chiameresti un'ombra? Certamente è implementato disegnando una sfumatura, ma lo scopo è far apparire la webview fluttuante sullo sfondo. Quindi lo chiamerò ancora un'ombra :-) – Brian

+0

Questo è abbastanza giusto. :-) Bounty assegnato per il collegamento della domanda, anche se questo dovrebbe forse essere chiuso come un duplicato? – MrCranky

+0

+1 per una risposta reale che funziona ancora 2 anni dopo. –

1

L'unico modo che ho trovato il modo per farlo era:

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

E 'solo a pochi passi attraverso i subviews di UIWebView e rimuove la vista se si tratta di una vista dell'immagine.

Non l'ho inserito in nessuna app dell'App Store, quindi non so se Apple lo accetterebbe.

MODIFICA: il collegamento di Brian fornisce ulteriori dettagli.

0

Utilizzando il metodo suggerito sopra, non sarà possibile modificare l'indicatore/i riquadri di scorrimento in un secondo momento. Essi appaiono come UIImageView anche, così si dovrebbe verificare la presenza di ultimo oggetto:

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

Per trasparente UIWebView e rimuovere i rotoli.

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

per hide scroll indicators

+0

webView.opaque = NO; hai usato ... – damithH

+0

Ricordati di assicurarti che qualsiasi superview della webview sia trasparente :) Allora questo script funzionerà per te – hfossli

0

sono stato in grado di fare questo con l'aggiunta di subviews bianchi per la parte superiore e inferiore del ScrollView del WebView. Controllo il contenuto di WebView, quindi so che il bianco è OK - questo non funzionerà se stai caricando contenuti arbitrari.

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

lo eseguo dopo il caricamento della pagina in modo che webView.scrollView.contentSize.height mi darà la giusta altezza. Non sono sicuro di come funzionerà se le tue pagine cambiano in altezza in modo dinamico. La mia pagina viene caricata solo una volta; se il tuo si sta ricaricando, vorrai saltare in esecuzione alloc/init su _topCover e _bottomCover dopo la prima volta per efficienza.

Aggiornamento: Non sono sicuro che il mio uso di autoresizingMask, sopra, sia sufficiente quando la vista ruota.Potrebbe essere necessario mettere questo nel UIViewController che contiene il UIWebView per ridimensionare le coperte dopo la rotazione:

- (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

Ho costruito alla risposta @damithH s'

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