31

UIWebView ウィンドウに配置された影を削除できるかどうかを知っている人はいますか?

例: http://uploadingit.com/files/1173105_olub5/shadow.png

可能な場合、どのようにしますか?

ありがとう

4

15 に答える 15

71

これは、「Nikolai Krill」ソリューションのよりクリーンな代替手段です。これは、UIWebView 内の UIImageViews のみを非表示にし、UIWebBrowserView は非表示にしません。

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

ありがとうジェームズ

于 2010-08-19T11:29:08.337 に答える
14

Apple がサブビューの数を変更するとクラッシュする可能性があるため、小さな 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];
}
于 2010-07-26T16:42:35.867 に答える
5

BOOL 値を取るセレクター set AllowRubberBanding: を持つプライベート メソッドがあります。NO を渡すと、コンテンツ領域の上部または下部を超えて Web ビューをスクロールすることはできなくなりますが、Web ビューを通常どおりスクロールすることはできます。残念ながら、このメソッドは非公開であり、アプリを使用しても、ストアへの掲載は許可されない可能性があります。

ただし、Objective-C のランタイムの動的な性質を使用して、メソッドの実装を抽出して、作成した別のセレクターにバインドする可能性があります。

それでも、このメソッドは非公開であり、OS の将来のバージョンでは存在しなくなる可能性があります。それでも試してみたい場合は、以下のサンプル コードを参照してください。このサンプル コードは、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);
}

このコードを使用して AppStore にアプリを送信することを選択した場合、これはおそらく Apple の静的アナライザーによって検出されることに注意してください。

于 2009-12-08T12:35:16.690 に答える
5

これは、iOS 9 の UIWebView でシャドウを取り除く Swift 関数です。これは、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(ドキュメント)の subviews プロパティにいつでもアクセスできます。Everyには( documentationUIView ) であるlayerプロパティがあります。すべてが(ドキュメント)を持っています。CALayerCALayershadowOpacity

警告:

  1. 状況によっては、サブビューを介してビュー階層をさらに深くナビゲートする必要がある場合があります。
  2. これは、Web ビュー コントローラーのどこにも影を付けたくない場合に限り機能します。シャドウを保持したいビューがある場合 (デフォルトの UIWebView シャドウ以外)、if-check を追加してそのビューを識別し、そのビューのレイヤーshadowOpacityをゼロに設定しないようにすることができます。
  3. Apple によると、「UIKit やその他のシステム フレームワークで宣言された複雑なビューの場合、ビューのサブビューは一般にプライベートと見なされ、いつでも変更される可能性があります。したがって、これらのタイプのシステム提供ビューのサブビューを取得または変更しようとしないでください。その場合、将来のシステム更新中にコードが壊れる可能性があります。」. . つまり、UIWebView は変更される可能性があり、これらのサブビューを掘り下げることはお勧めしません。ただし、UIWebView を掘り下げることが影を取り除く唯一の方法であり、これは比較的安全な方法です。
于 2016-08-29T13:56:19.667 に答える
4

これは、プライベート API を使用せずに実行できます。必要なのは、影のある各 UIImageView を非表示にすることだけです。コードは次のとおりです。

for (int x = 0; x < 10; ++x) {
    [[[[[webView subviews] objectAtIndex:0] subviews] objectAtIndex:x] setHidden:YES];
}
于 2010-04-20T22:45:17.913 に答える
2

すべてのサブビューをトラバースします。画像の幅が1ピクセルしかないUIImageViewはシャドウ画像であり、非表示にすることができます。

- (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];
    }
}
于 2012-09-07T19:52:11.027 に答える
1

スクロール インジケーターを非表示にし、UIWebView でWeb ビューを透明にする最も簡単な方法

スクロールを削除するには。

    for(UIView *view in webView.subviews){   
         if ([view isKindOfClass:[UIScrollView class]]) {  
              UIScrollView *sView = (UIScrollView *)view;  
              //to hide verticalScroller  
              sView.showsVerticalScrollIndicator = NO;
              sView.showsVerticalScrollIndicator = NO;
         }   
    }  
于 2012-06-13T09:41:00.953 に答える
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;
}
于 2013-08-25T13:18:13.197 に答える
1

クラスのプロパティを調べたところ、何も見つかりませんでしたが、2 つの「隠蔽」戦略を考えることができます

。 1.別のビュー (Web ビューの親) を使用して、Web ビューの境界を切り取ることができます。
2. webview の上に別のビューを追加して、必要な領域を背景と一致する色で覆うことができます。中央に透明な領域がある uiimage を使用できます。

ちなみに、私はテーブルビューのこの標準的な背景が好きではありません:P、しかし、それを変更するのはお尻の痛みになる可能性があります:P

于 2009-07-02T23:27:29.783 に答える
0

私は周りを見回しましたが、それに関連するものは何も見えません。ビューでマスクしたり、なんらかの方法でクリップしたりする以外に、私が考えることができるのは、すべてのUIWebViewサブビュー(およびサブサブビューなど)をループして、そこに何かが表示されるかどうかを確認することだけです。

于 2009-11-20T01:20:26.103 に答える
0

私は間違っているかもしれませんが、ウェブビューをスクロールしたときにのみ影が表示されると思いますか? その場合、スクロールを防止しますか、それとも本当に影を隠しますか? 影を隠すコツがわかりません。スクロールを無効にするには、UserInteractionEnabled を NO に設定します。

于 2009-11-20T20:07:03.933 に答える
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
于 2012-07-16T23:03:17.580 に答える