2009-07-02 3 views
31

Кто-нибудь знает, можно ли удалить тень, которая находится в окне UIWebView?Удалить UIWebView Shadow?

Пример: http://uploadingit.com/files/1173105_olub5/shadow.png

Если его можно, как вы это делаете?

Благодаря

+0

http://stackoverflow.com/questions/655225/uiwebview-underside – LolaRun

+7

Ваше изображение не делает, больше не работает ... – Besi

+0

возможного дубликата [Удалить градиентный фон из UIWebView? ] (http://stackoverflow.com/questions/3009063/remove-gradient-background-from-uiwebview) – Pang

ответ

1

Я посмотрел на свойствах класса и не нашел там ничего, но я могу думать о двух «прикрывать» стратегию:

1. Вы можете использовать другой вид (родитель из веб-просмотр), чтобы скопировать границы веб-просмотра.
2. Вы можете добавить еще один вид сверху веб-обозревателя, чтобы покрыть нужную область цветом, соответствующим фону, вы можете использовать uiimage с прозрачной областью в центре.

Кстати мне не нравится этот стандартный фон взглядов таблицы: P, но изменить это может быть боль в заднице: P

0

Я имел взгляд вокруг и не может видеть все, что с ним связано. Помимо маскировки его каким-либо образом или его обрезкой, я могу только подумать о том, чтобы перебрать все подвижки UIWebView (и подзапросы и т. Д.), И посмотреть, можете ли вы что-нибудь увидеть там!

0

Возможно, я ошибаюсь, но я думаю, что тень появляется только тогда, когда мы просматриваем веб-просмотр, не так ли? В этом случае вы хотите предотвратить прокрутку или скрыть тень? Я не знаю советов, которые скрывали бы тень. Чтобы отключить прокрутку, я бы установил значениеUserInteractionEnabled равным NO.

5

Существует частный метод с селектором setAllowsRubberBanding: это значение BOOL. Если прошло НЕТ, вы не сможете прокручивать веб-представление за верхнюю или нижнюю часть области содержимого, но по-прежнему сможете прокручивать веб-представление в обычном режиме. К сожалению, этот метод является частным, и ваше приложение, скорее всего, не будет разрешено в хранилище, если вы его используете.

Возможно, вы можете попробовать и извлечь реализацию метода и связать его с другим селектором, который вы создали, используя динамическую природу среды выполнения Objective-C.

Тем не менее, метод является закрытым и может больше не существовать в будущих версиях ОС. Если вы все еще хотите попробовать, вот пример кода, который извлечет реализацию setAllowsRubberBanding: и вызовет его для вас.

static inline void ShhhDoNotTellAppleAboutThis (UIWebView *webview) 
{ 
    const char *hax3d = "frgNyybjfEhooreOnaqvat"; 
    char appleSelName[24]; 

    for (int i = 0; i < 22; ++i) 
    { 
     char c = hax3d[i]; 
     appleSelName[i] = (c >= 'a' && c <= 'z') ? ((c - 'a' + 13) % 26) + 'a' : ((c - 'A' + 13) % 26) + 'A'; 
    } 
    appleSelName[22] = ':'; 
    appleSelName[23] = 0; 

    SEL appleSEL = sel_getUid(appleSelName); 

    UIScrollView *scrollView = (UIScrollView *)[webview.subviews objectAtIndex:0]; 
    Class cls = [scrollView class]; 
    if (class_respondsToSelector(cls, appleSEL) == NO) 
    { 
     return; 
    } 

    IMP func = class_getMethodImplementation(cls, appleSEL); 
    func(scrollView, appleSEL, NO); 
} 

Пожалуйста, обратите внимание, что это, вероятно, все еще пойманы статический анализатор Apple, если вы решите подать приложение, используя этот код в AppStore.

4

Это можно сделать без использования частных API. Все, что вам нужно сделать, это скрыть каждый UIImageView тень в нем. Heres код:

for (int x = 0; x < 10; ++x) { 
    [[[[[webView subviews] objectAtIndex:0] subviews] objectAtIndex:x] setHidden:YES]; 
} 
+1

Это сработало для меня. Благодаря! –

+1

Это может произойти сбой, если нет подзаголовков – parceval

+0

Это работает для нас здесь спасибо! Однако, что, если код Apple изменится? Какие ошибки меня в том, что если вы хотите отформатированный текст, вам рекомендуется использовать UIWebView ... Но UIWebView выглядит не так! – jowie

14

маленькая петля очень опасна, потому что она может упасть, если яблоко изменит количество подзонов.

таким образом, это по крайней мере не врезаться, когда что-то меняется:

if ([[webView subviews] count] > 0) 
{ 
    for (UIView* shadowView in [[[webView subviews] objectAtIndex:0] subviews]) 
    { 
     [shadowView setHidden:YES]; 
    } 

    // unhide the last view so it is visible again because it has the content 
    [[[[[webView subviews] objectAtIndex:0] subviews] lastObject] setHidden:NO]; 
} 
+0

Это сбой, когда Apple решает поставить нулевые объекты в UIWebView. –

+4

ОК, я положил еще один чек вокруг, счастлив теперь? ;) – denis2342

71

Это уборщик альтернатива решение «Николай Криль».Это скрывает только UIImageViews в UIWebView, а не UIWebBrowserView.

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

Благодаря Джеймс

+0

Кто-то уже прошел это через процесс проверки appStore? – Francescu

+0

Да, приложение, которое я создал, использует этот код и впервые провело проверку в понедельник. – jodm

+0

После тестирования я полагаю, что это решение работает только для iOS 4.x? – alexleutgoeb

0

Самый простой способ скрыть индикаторы прокрутки и прозрачный веб вид here в UIWebView

Чтобы удалить свитки.

for(UIView *view in webView.subviews){  
         if ([view isKindOfClass:[UIScrollView class]]) { 
              UIScrollView *sView = (UIScrollView *)view; 
              //to hide verticalScroller 
              sView.showsVerticalScrollIndicator = NO; 
       sView.showsVerticalScrollIndicator = NO; 
         } 
    } 
0

Я добавил рекурсивный метод как категория до объекта UIView так, что он будет делать в глубину ходьбы от подвидов из приемного зрения метода, скрывая любые UIImageView подклассов, которые он находит. Он не будет сбой, если нет подзаголовков. Метод -apply: от BlocksKit. Вы можете переписать эту функцию, чтобы не использовать ее, но блок применяется параллельно каждому элементу принимающего массива, так что это довольно быстро.

@implementation UIView (RemoveShadow) 

- (void)removeShadow { 
    if (self.subviews.count == 0 && [self isKindOfClass:[UIImageView class]]) { 
    self.hidden = YES; 
    } else if (self.subviews.count > 0) { 
    [self.subviews apply:^(id sender) { 
     [(UIView *)sender removeShadow]; 
    }]; 
    } 
} 

@end 
2

траверс все подвиды, то UIImageViews, образ которого широко только 1 пиксель являются теневые изображения, вы можете скрыть их.

- (void)hideShadows { 
    [webview traverseViewsWithBlock:^(UIView *view) { 
     UIImageView *imgView = ([view isKindOfClass:[UIImageView class]] ? (UIImageView*)view : nil; 
     // image views whose image is 1px wide are shadow images, hide them 
     if (imgView && imgView.image.size.width == 1) { 
      imgView.hidden = YES; 
     } 
    }]; 
} 

traverseViewsWithBlock делает то, что он выглядит следующим образом:

- (void)traverseViewsWithBlock:(void (^)(UIView* view))block 
{ 
    block(self); 
    for (id subview in self.subviews) { 
     [subview traverseViewsWithBlock:block]; 
    } 
} 
1

насчет категории на UIWebView, как это:

- (BOOL)showsScrollShadows 
{ 
    for(UIImageView *imageView in [self imageViewsWithShadows]) 
    { 
     if(imageView.hidden) 
     { 
      return NO; 
     } 

     break; 
    } 

    return YES; 
} 

- (void)setShowsScrollShadows:(BOOL)showsScrollShadows 
{ 
    [[self imageViewsWithShadows] makeObjectsPerformSelector:@selector(setHidden:) withObject:@(!showsScrollShadows)]; 
} 

- (NSArray *)imageViewsWithShadows 
{ 
    NSArray *potentialShadowImageViews = (self.subviews.count > 0) ? [self.subviews[0] subviews] : nil; 

    if(potentialShadowImageViews.count > 0) 
    { 
     NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) 
     { 
      return [evaluatedObject isKindOfClass:[UIImageView class]]; 
     }]; 

     return [potentialShadowImageViews filteredArrayUsingPredicate:predicate]; 
    } 

    return nil; 
} 
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; 
3

Здесь является Swift функция, которая избавляется от тень в UIWebView в iOS 9. Это безопаснее, чем любая альтернатива, которую я видел на SO, потому что все в ней находится в документе Apple и в частности он изменяет свойство тени (в отличие от скрытия всего представления или какого-либо другого свойства представления).

func removeShadow(webView: UIWebView) { 
    for subview:UIView in webView.scrollView.subviews { 
     subview.layer.shadowOpacity = 0 
     for subsubview in subview.subviews { 
      subsubview.layer.shadowOpacity = 0 
     } 
    } 
} 

Вы всегда можете получить доступ к подвидам свойства UIView (documentation). Каждый UIView имеет layer имущество, которое является CALayer (documentation). Каждый CALayer имеет shadowOpacity (documentation).

Предостережения:

  1. Вы, возможно, придется идти глубже в навигации по иерархии просмотра через подвидов в зависимости от ситуации.
  2. Это работает, пока вы не хотите никаких теней в любом месте контроллера веб-представления. Если у вас есть представление, в котором вы хотите сохранить тень (кроме тени UIWebView по умолчанию), тогда вы можете добавить if-check, чтобы идентифицировать это представление, а нена ноль.
  3. В соответствии с Apple «Для сложных представлений, объявленных в UIKit и других системных рамках, любые подходы к представлению обычно считаются частными и могут быть изменены в любое время.Поэтому вы не должны пытаться извлекать или изменять подпункты для этих типов представлений, поставляемых системой. Если вы это сделаете, ваш код может сломаться во время будущего обновления системы ». , , другими словами, UIWebView может измениться, и его не рекомендуется копать в эти подпункты. Однако, копание в UIWebView - единственный способ избавиться от тени, и это относительно безопасный способ сделать это.
1

Попробуйте

func webViewDidFinishLoad(_ webView: UIWebView) { 
    for shadowView in self.webView.scrollView.subviews { 
     if !shadowView.isKind(of: UIImageView.self) { 
      shadowView.subviews[0].layer.shadowColor = UIColor.clear.cgColor 
     } else { 
      shadowView.layer.shadowColor = UIColor.clear.cgColor 
     } 
    } 
} 
Смежные вопросы