Удалить градиентный фон из UIWebView? - PullRequest
36 голосов
/ 09 июня 2010

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

webView.backgroundColor = [UIColor whiteColor];

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

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

Ответы [ 8 ]

82 голосов
/ 12 ноября 2010

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

{
    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 голосов
/ 13 июня 2012

Для прозрачности 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];
                }
           }
      }
 }

для скрыть индикаторы прокрутки

2 голосов
/ 12 ноября 2010

Вы имеете в виду тень? Удалить UIWebView Shadow?

1 голос
/ 12 ноября 2010

Я нашел только один способ сделать это:

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

Он просто проходит через подпредставления UIWebView и удаляет представление, если это представление изображения.

IЯ не знаю, согласится ли Apple на это.

РЕДАКТИРОВАТЬ: ссылка Брайана содержит более подробную информацию.

0 голосов
/ 18 июня 2014
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;
0 голосов
/ 23 января 2013

Я опираюсь на ответ @damithH

@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 голосов
/ 08 октября 2012

Я смог сделать это, добавив белые подпредставления вверху и внизу 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 голосов
/ 08 октября 2011

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

            UIView* lastView = [[subView subviews] lastObject];
            for (UIView* shadowView in [subView subviews])
            { 
                if(shadowView!=lastView) ... <-this one is a scroll 
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...