Удалить UIWebView Shadow?

Кто-нибудь знает, можно ли удалить тень, помещенную в окно UIWebView?

Пример: http://sofru.miximages.com/iphone/

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

благодаря

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

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

Спасибо Джеймсу

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

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

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

Существует частный метод с селектором 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.

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

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

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

 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 ( документация ). Каждый UIView имеет свойство layer которое является CALayer ( документация ). Каждый CALayer имеет shadowOpacity ( документация ).

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

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

Перемещение всех подзонов, 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]; } } 

Попробуй это

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

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

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

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

Вы должны быть осторожны, индикаторы прокрутки – UIImageViews. Я улучшу свой код, но вот базовое подclassовое решение:

http://forrst.com/posts/A_tiny_UIWebView_hack_remove_shadows_from_behi-gzH

Самый простой способ скрыть указатели прокрутки и прозрачный веб-просмотр здесь в 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;   } } 

Что относительно категории в 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; } 

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

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

Я добавил рекурсивный метод в качестве категории для объекта UIView, чтобы он выполнял глубину в первом просмотре представлений получающего метода, скрывая любые подclassы 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 
 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; 
  • Как отобразить вызов аутентификации в UIWebView?
  • Как вызвать Objective-C из Javascript?
  • Содержимое HTML соответствует UIWebview без масштабирования
  • Asp.Net Forms Authentication при использовании iPhone UIWebView
  • UIWebView отправляет один и тот же User-Agent в заголовки запроса в качестве мобильного Safari?
  • UIWebView: когда страница действительно заканчивала загрузку?
  • Переход на WKWebView
  • iPhone UIWebView локальных ресурсов с использованием Javascript и обработки onorientationChange
  • Кадр манифеста html5 в UIWebView?
  • Остановить UIWebView от «подпрыгивания» по вертикали?
  • iPhone - UIWebview - Получите URL-адрес ссылки, нажатой
  • Давайте будем гением компьютера.