web-dev-qa-db-ja.com

UIWebViewからグラデーションの背景を削除しますか?

UIWebViewからグラデーションを削除するにはどうすればよいですか?上または下を上にスクロールすると表示されます。このコード

webView.backgroundColor = [UIColor whiteColor];

グラデーションの色を変更するだけで、削除はしません。これはどのように行うことができますか?

(注: IWebView下側 と同じ質問ではありません)

36
cannyboy

ああ、そうです、用語は失敗します。私はそれを影とはまったく呼びませんが、c'est lavieです。これが効果を達成するための私のタイプセーフコードです。要約すると、これにより、スクロールビューの画像ビューの子が非表示になります。 (objectAtIndex:0)メソッドほど変更に対して脆弱ではないため、Apple webViewコントロールの子を並べ替えると、正常に機能しますが、グラデーションという事実に依存します。効果は、スクロールビューの親となるイメージビューによって適用されます(実際、Webビューを支えるスクロールビューがあります)。

{
    webView.backgroundColor = [UIColor whiteColor];
    for (UIView* subView in [webView subviews])
    {
        if ([subView isKindOfClass:[UIScrollView class]]) {
            for (UIView* shadowView in [subView subviews])
            {
                if ([shadowView isKindOfClass:[UIImageView class]]) {
                    [shadowView setHidden:YES];
                }
            }
        }
    }
}
82
MrCranky

UIWebViewを透過的にして、スクロールを削除します。

 webView.opaque = NO;
 webView.backgroundColor = [UIColor clearColor];
 for(UIView *view in webView.subviews){      
      if ([view isKindOfClass:[UIImageView class]]) {
           // to transparent 
           [view removeFromSuperview];
      }
      if ([view isKindOfClass:[UIScrollView class]]) {
           UIScrollView *sView = (UIScrollView *)view;
           for (UIView* shadowView in [sView subviews]){
                //to remove shadow
                if ([shadowView isKindOfClass:[UIImageView class]]) {
                     [shadowView setHidden:YES];
                }
           }
      }
 }

for スクロールインジケーターを非表示

3
damithH
2
Brian

私がこれを行う方法を見つけた唯一の方法は:

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

UIWebViewのサブビューをステップスルーするだけで、画像ビューの場合はビューを削除します。

私はこれをどのAppStoreアプリにも入れていないので、Appleがそれを受け入れるかどうかはわかりません。

編集:ブライアンのリンクは詳細を提供します。

1
cannyboy
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;
0
Friend_LGA

上記の方法を使用すると、後でスクロールインジケーター/挿入を編集することはできません。これらはUIImageViewとしても表示されるため、最後のオブジェクトを確認する必要があります。

            UIView* lastView = [[subView subviews] lastObject];
            for (UIView* shadowView in [subView subviews])
            { 
                if(shadowView!=lastView) ... <-this one is a scroll 
            }
0
Roman B.

@damithHの答えに基づいて構築しました

@implementation UIWebView (Extensions)

- (void)setBackgroundAndShadowVisible:(BOOL)visible
{
    self.opaque = !visible;
    self.backgroundColor = [self.backgroundColor colorWithAlphaComponent:visible ? 1.0 : 0.0];
    for(UIView *view in [self subviews])
    {
        if([view isKindOfClass:[UIImageView class]])
        {
            view.hidden = !visible;
        }
        if([view isKindOfClass:[UIScrollView class]])
        {
            UIScrollView *scrollView = (UIScrollView *)view;
            for (UIView *shadowView in [scrollView subviews])
            {
                if ([shadowView isKindOfClass:[UIImageView class]])
                {
                    shadowView.hidden = !visible;
                }
            }
        }
    }
}

@end
0
hfossli

これを行うには、WebViewのscrollViewの上部と下部に白いサブビューを追加しました。私はWebViewのコンテンツを管理しているので、白で問題ないことはわかっています。任意のコンテンツを読み込んでいる場合、これは機能しません。

// _topCover and _bottomCover are ivar UIViews
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // with cover views 300pt high, I couldn't scroll far enough to see the shadow,
    // even in portrait on an iPad, which gives you the longest scroll distance
    CGFloat coverage = 300;

    _topCover = [[UIView alloc] initWithFrame:CGRectMake(0, -coverage, webView.bounds.size.width, coverage)];
    _bottomCover = [[UIView alloc] initWithFrame:CGRectMake(0, webView.scrollView.contentSize.height, webView.bounds.size.width, coverage)];
    _topCover.backgroundColor = [UIColor whiteColor];
    _bottomCover.backgroundColor = [UIColor whiteColor];

    // in case the webView is resized, e.g. by rotating the device
    _topCover.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
    _bottomCover.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;

    [webView.scrollView addSubview:_topCover];
    [webView.scrollView addSubview:_bottomCover];
}

webView.scrollView.contentSize.heightで正しい高さが得られるように、ページが読み込まれた後に実行します。ページの高さが動的に変化する場合、これがどのように機能するかわかりません。私のページは一度だけ読み込まれます。リロードする場合は、効率を上げるために、_topCover_bottomCoverでのalloc/initの実行をスキップすることをお勧めします。

更新:ビューが回転するときに上記のautoresizingMaskを使用するだけで十分かどうかはわかりません。回転後にカバーのサイズを変更するには、これをUIViewControllerを含むUIWebViewに入れる必要がある場合があります。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{        
    CGFloat coverage = 300;
    _topCover.frame = CGRectMake(0, -coverage, self.webView.bounds.size.width, coverage);
    _bottomCover.frame = CGRectMake(0, self.webView.scrollView.contentSize.height, self.webView.bounds.size.width, coverage);
}
0
Zev Eisenberg