2010-06-09 13 views
35

Cómo eliminar el degradado de un UIWebView, el que verá si sobrescribe la parte superior o inferior. Este código Eliminar fondo degradado de UIWebView?

webView.backgroundColor = [UIColor whiteColor]; 

sólo cambia el color de la pendiente, no lo elimina. ¿Cómo puede hacerse esto?

(nota: no es la misma pregunta que UIWebView underside)

+1

me gustaría descubra esto también, ya que eso haría que el rebote se vea bien en un UIWebView ... –

+0

Sí, esto es más molesto, también estaría interesado en una solución – MrCranky

+0

posible duplicado de [¿Quitar UIWebView Shadow?] (http://stackoverflow.com/questions/1074320/remove-uiwebview-sh adorar) – JosephH

Respuesta

82

Aha, sí la terminología falla. No lo llamaría una sombra en absoluto, pero c'est la vie. Aquí está mi código de tipo seguro para lograr el efecto. Para resumir: esto ocultará cualquier vista de imagen de los niños de la vista de desplazamiento. No es tan vulnerable al cambio como los métodos (objectAtIndex: 0), por lo que si Apple vuelve a ordenar los elementos secundarios del control webView funcionará bien, pero aún así depende del hecho de que el efecto de gradiente se aplica mediante vistas de imagen parentales al desplazamiento vista (y que de hecho hay una vista de desplazamiento que sustenta 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

¿No lo llamarías una sombra? Ciertamente, se implementa dibujando un degradado, pero el propósito es hacer que la vista web parezca flotar sobre el fondo. Así que todavía lo llamaré una sombra :-) – Brian

+0

Eso es justo. :-) Recompensa otorgada por vincular la pregunta, aunque ¿debería cerrarse ésta como duplicado? – MrCranky

+0

+1 por una respuesta real que todavía funciona 2 años después. –

1

La única manera que encontré cómo hacer esto era:

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

Sólo a pocos pasos a través de los subvistas de UIWebView y elimina la vista si se trata de una vista de la imagen.

No he puesto esto en ninguna aplicación de la App Store, por lo que no sé si Apple lo aceptaría.

EDIT: enlace de Brian proporciona más detalles.

0

Utilizando el método sugerido anteriormente, no podrá editar su indicador/inserciones de desplazamiento más adelante. Aparecen como UIImageView también, por lo que debe comprobar último objeto:

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

Para transparente del UIWebView y retirar los rollos.

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

para hide scroll indicators

+0

webView.opaque = NO; lo has usado ... – damithH

+0

Recuerda asegurarte de que cualquier supervista de la vista web también sea transparente :) Entonces este script funcionará para ti – hfossli

0

que era capaz de hacer esto mediante la adición de subvistas blancas a la parte superior e inferior de ScrollView de la vista Web. Controlo el contenido de WebView, así que sé que el blanco está bien; esto no funcionará si está cargando contenido arbitrario.

// _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 funciono después de la página se carga de manera que webView.scrollView.contentSize.height me dará la altura correcta. No estoy seguro de cómo funcionará si tus páginas cambian dinámicamente de altura. Mi página se carga solo una vez; si la tuya se está recargando, querrás omitir ejecutar alloc/init en _topCover y _bottomCover después de la primera vez por eficiencia.

Actualización: No estoy seguro de que mi uso de autoresizingMask, anterior, sea suficiente cuando la vista gira.Puede que tenga que poner esto en el UIViewController que contiene su UIWebView cambiar el tamaño de las cubiertas después de rotar:

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

que he construido en respuesta @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; 
Cuestiones relacionadas