Nano Hash - криптовалюты, майнинг, программирование

Удалить UIWebView Shadow?

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

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

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

Спасибо

02.07.2009


Ответы:


1

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

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

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

19.08.2010
  • Кто-то уже прошел это через процесс проверки appStore? 15.09.2010
  • Да, приложение, которое я создал, использует этот код и впервые прошло проверку в понедельник. 16.09.2010
  • После тестирования, я полагаю, это решение работает только для iOS 4.x? 09.12.2010
  • Спасибо, Мартин, мой комментарий от 2010 года был вызван соображениями совместимости с 3.x в то время;) 20.06.2012
  • Чтобы сохранить индикаторы полосы прокрутки, используйте этот код: if([wview isKindOfClass:[UIImageView class]] && wview.frame.size.width != 7) { wview.hidden = YES; } вместо оператора if в этом ответе. 24.11.2012
  • Работает и на iOS 6 (только что проверено) и не дает сбоев на iOS 7 (возможно, в будущих выпусках произойдет сбой). Так что по крайней мере безопасно использовать для 5 ‹= iOS‹ = 7.0 17.12.2013

  • 2

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

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

    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];
    }
    
    26.07.2010
  • Он действительно вылетает, когда Apple решает поместить нулевые подпредставления в UIWebView. 27.07.2010

  • 3

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

    Однако вы можете попробовать извлечь реализацию метода и привязать ее к другому селектору, который вы создали, используя динамический характер среды выполнения 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.

    08.12.2009

    4

    Вот функция 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
            }
        }
    }
    

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

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

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

    5

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

    for (int x = 0; x < 10; ++x) {
        [[[[[webView subviews] objectAtIndex:0] subviews] objectAtIndex:x] setHidden:YES];
    }
    
    20.04.2010
  • Это могло привести к сбою, если нет подвидов 04.08.2010
  • У нас это работает, спасибо! Однако что, если код Apple изменится? Что меня беспокоит, так это то, что если вам нужен форматированный текст, вам рекомендуется использовать UIWebView ... Но UIWebView выглядит иначе! 19.08.2010
  • Святое дерьмо ... Никогда не допускайте подобных вещей в непрозрачной иерархии представлений! 12.03.2013

  • 6

    Попробуй это

    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.08.2017

    7

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

    8

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

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

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

    02.07.2009

    9

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

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

    02.03.2011

    10

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

    11

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

    12

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

    20.11.2009

    13

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

    20.11.2009

    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
    
    16.07.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..