Подтвердить что ты не робот

Удалить UIWebView Shadow?

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 5

Вот функция Swift, которая избавляется от тени в UIWebView в iOS 9. Она более безопасна, чем любая другая Ive, которая видна на 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
        }
    }
}

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

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

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

Ответ 6

Переместите все подпункты, 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];
    }
}

Ответ 7

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

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

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

Ответ 9

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

Ответ 10

Попробуйте это

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

Я добавил рекурсивный метод в качестве категории для объекта 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

Ответ 15

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;