2010-06-09 2 views
35

Как удалить градиент из UIWebView - тот, который вы видите, если вы прокручиваете верхнюю или нижнюю часть. Этот кодУдалить градиентный фон от UIWebView?

webView.backgroundColor = [UIColor whiteColor]; 

просто меняет цвет градиента, он не удаляет его. Как это может быть сделано?

(примечание: не тот же вопрос, как UIWebView underside)

+1

Я хотел бы тоже это обнаружите, так как это приведет к хорошему отскоку в UIWebView ... –

+0

Да, это очень раздражает, меня также интересует решение – MrCranky

+0

возможного дубликата [Удалить UIWebView Shadow?] (http: /stackoverflow.com/questions/1074320/remove-uiwebview-sh adow) – JosephH

ответ

82

Aha, да терминологический отказ. Я бы не назвал эту тень вообще, но c'est la vie. Вот мой безопасный код для достижения эффекта. Подводя итог: это скроет любые изображения с просмотром прокрутки. Это не так уязвимо для изменения, как методы (objectAtIndex: 0), поэтому, если Apple переупорядочит дочерние элементы элемента управления webView, он будет работать нормально, но все же полагается на то, что эффект градиента применяется изображениями, родившимися для прокрутки view (и что действительно есть scrollview, лежащий в основе веб-представления).

{ 
    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

Вы бы не назвали это тенью? Конечно, это реализуется путем рисования градиента, но цель состоит в том, чтобы заставить webview отображаться на фоне. Поэтому я все равно буду называть это тень :-) – Brian

+0

Это справедливо. :-) Награда за награду за увязку вопроса, хотя следует ли ее закрыть как дубликат? – MrCranky

+0

+1 для реального ответа, который все еще работает 2 года спустя. –

1

Единственный способ я нашел, как сделать это:

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

Это только в нескольких шагах через от подвидов из UIWebView и удаляет мнение, если это вид изображения.

Я не помещал это в приложения App Store, поэтому я не знаю, примет ли Apple его.

EDIT: ссылка Брайана содержит более подробную информацию.

0

Используя предложенный выше метод, вы не сможете отредактировать указатель прокрутки позже. Они появляются как UIImageView также, так что вы должны проверить последний объект:

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

Для прозрачны в UIWebView и удалить свитки.

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

для hide scroll indicators

+0

webView.opaque = NO; вы используете его .. – damithH

+0

Не забудьте убедиться, что любой просмотр веб-просмотра также прозрачен :) Затем этот скрипт будет работать для вас – hfossli

0

Я был в состоянии сделать это путем добавления белых подвидов в верхней и нижней части Scrollview в WebView в. Я контролирую содержимое WebView, поэтому я знаю, что белый в порядке - это не будет работать, если вы загружаете произвольный контент.

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

я запускаю его это после загрузки страницы, так что webView.scrollView.contentSize.height даст мне правильную высоту. Я не уверен, как это будет работать, если ваши страницы динамически меняют высоту. Моя страница загружается только один раз; если вы перезагружаетесь, вам нужно будет пропустить alloc/init на _topCover и _bottomCover после первого раза за эффективность.

Обновление: Я не уверен, что мое использование autoresizingMask, выше, достаточно, когда вид вращается.Вы, возможно, потребуется поместить это в UIViewController, который содержит ваш UIWebView, чтобы изменить размер крышки после поворота:

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

Я построил на @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; 
Смежные вопросы