2010-06-09 2 views
35

상단 또는 하단을 오버 스크롤하는 경우 표시되는 그라디언트를 UIWebView에서 제거하는 방법은 무엇입니까? 이 코드UIWebView에서 그라디언트 배경을 제거 하시겠습니까?

webView.backgroundColor = [UIColor whiteColor]; 

그냥 그라데이션의 색상을 변경, 그것을 제거하지 않습니다. 어떻게 할 수 있습니까?

(참고 : UIWebView underside과 같은 질문)

+1

내가 싶습니다 UIWebView에서 바운스 (bounce) 모양이 멋지게 보이도록하기 위해 이것도 찾으십시오. –

+0

예, 이것은 가장 귀찮습니다. 솔루션에 관심이 있습니다. – MrCranky

+0

[Remove UIWebView Shadow?] (http :// /stackoverflow.com/questions/1074320/remove-uiwebview-sh adow) – JosephH

답변

82

아하, 예 전문 용어가 실패합니다. 나는 그 그림자를 전혀 부르지 않을 것이다. 그러나 c'est la vie. 그 효과를 얻기 위해 내 형식 안전 코드가 있습니다. 요약하면 : 스크롤 뷰의 이미지 뷰 하위가 숨겨집니다. 그것은 (objectAtIndex : 0) 메쏘드만큼 변하지 않기 때문에, 애플이 webView 컨트롤의 자식을 재 배열하면 잘 동작하지만 그래디언트 효과가 스크롤에 부모 역할을하는 imageviews에 의해 적용된다는 사실에 의존한다. 보기 (실제로 웹보기의 밑줄을 긋는 스크롤보기가 있음).

{ 
    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]; 
       } 
      } 
     } 
    } 
} 
+3

그림자라고하지 않겠습니까? 확실히 그래디언트를 그려서 구현되지만, 목적은 웹 뷰가 배경 위에 떠있는 것처럼 보이게 만드는 것입니다. 그래서 나는 여전히 그것을 그림자라고 부를 것이다 :-) – Brian

+0

그건 충분히 공평합니다. :-) 바운티는 질문을 연결하는 것으로 수여되었지만, 아마도 이것이 복제본으로 닫혀 있어야합니까? – MrCranky

+0

2 년 후에도 여전히 작동하는 실제 답변은 +1입니다. –

1

나는이 작업을 수행하는 방법을 발견하는 유일한 방법이었다 :

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

그냥 단지의 UIWebView의 서브 뷰를 통해 단계를하고 이미지 뷰의 경우 뷰를 제거합니다.

나는 이것을 애플 스토어 앱에 넣지 않았다. 그래서 애플이 그것을 받아 들일지 모르겠다.

편집 : 브라이언의 링크는 자세한 내용을 제공합니다.

0

위에서 제안한 방법을 사용하면 나중에 스크롤 표시기/인세 트를 편집 할 수 없습니다. 그들은 또한 UIImageView로 표시되므로 마지막 객체를 확인해야합니다.

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

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

hide scroll indicators

+0

webView.opaque = NO; 그것을 사용 해보세요. – damithH

+0

webview의 superview도 투명해야합니다 :) 그럼이 스크립트는 당신을 위해 작동합니다 – hfossli

0

위해 나는 웹보기의있는 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이 정확한 높이를 제공하도록 페이지를로드 한 후에 실행합니다. 귀하의 페이지가 동적으로 높이를 변경하는 경우 이것이 어떻게 작동하는지 잘 모르겠습니다. 내 페이지가 한 번만로드됩니다. 로드하는 경우 alloc/init을 건너 뛰고 효율성을 위해 처음으로 _topCover_bottomCover을 건너 뛰고 싶을 것입니다.

업데이트 :보기가 회전 할 때 위의 autoresizingMask을 사용하는 것으로 충분하지는 않습니다.당신은 회전 후 커버의 크기를 조정하기 위해 UIWebView 들어있는 UIViewController에 넣고해야 할 수도 있습니다

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

내가에 구축 한 @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
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; 
관련 문제