iPhone SDK - UIWebView имеет серый прямоугольник над ним - PullRequest
4 голосов
/ 07 ноября 2008

Иногда мой UIWebView будет иметь серый прямоугольник над частью или всем содержимым. Я не могу понять, почему это происходит. Это происходит регулярно для определенного контента.

Спасибо!

- Обновление -

Кажется, что это происходит, когда веб-просмотр не отображается сразу на экране - то есть, у меня есть прокрутка, а веб-просмотр ниже сгиба.

- Обновление № 2 -

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

- Обновление № 3 -

Хорошо, похоже, что если мой uiwebview имеет высоту, превышающую 1000 пикселей, на остальной части содержимого ниже 1000 пикселей появляется серый прямоугольник. Двойное касание показывает фактическое содержание.

Ответы [ 7 ]

1 голос
/ 31 июля 2010

Подталкивание UIScrollView в UIWebView это исправляет для меня:

[UIScrollView *webScroller= [[webView subviews] lastObject];    
[webScroller setContentOffset:CGPointMake(0,1) animated:NO];
[webScroller setContentOffset:CGPointMake(0,0) animated:NO];
1 голос
/ 04 февраля 2009

Все UIViews имеют ограничение размера 1024x1024 пикселей. Это указано в конце раздела «Обзор» документации UIView.

Если в вашем веб-представлении должно быть более 1024 пикселей контента, вам придется вывести его из родительского представления прокрутки и позволить ему управлять прокруткой самостоятельно.

0 голосов
/ 06 ноября 2010

Я столкнулся с той же проблемой при динамическом изменении размера UIWebView. Вот что сработало для меня:

#define LAYER_FOR(ui)                        [(ui) layer]
#define FRAME_FOR(ui)                        [LAYER_FOR((ui)) frame]
#define SET_FRAME_FOR(ui, frame)             [LAYER_FOR((ui)) setFrame: (frame)]

+ (void) setHeightTo: (CGFloat *) height_ptr forView: (UIView *) a_view {
  CGFloat height = *height_ptr;

  CGRect existing_frame = [[a_view layer] frame];
  existing_frame.size.height = height;

  // need to reassign the same frame !?
  NSLog(@"setting text view: %@ to height: %f", a_view, (float) height);
  SET_FRAME_FOR(a_view, existing_frame);
}

+ (void) resizeWebView: (UIWebView *) webView {
  NSString *js = @"                                                                                               \
    var __html_element = document.getElementsByTagName('html')[0];                                                \
    var __height_string = document.defaultView.getComputedStyle(__html_element, null).getPropertyValue('height'); \
    __height_string.replace('px', ''); \
  ";

  NSString *heightString = [webView stringByEvaluatingJavaScriptFromString: js];
  float height = [heightString floatValue];

  if (height != UI_VIEW_HEIGHT(webView)) {
    [self setHeightTo: &height forView: webView];

    // resize scrollView inside webview to the same height
    UIScrollView *webScroller = [[webView subviews] lastObject];
    [self setHeightTo: &height forView: webScroller];
  }
}

Я вызвал этот код у делегата webview метода 'webViewDidFinishLoad:'.

По сути, дело в том, чтобы изменить размер webScroller внутри webview.

Спасибо Падрейгу за предложение подтолкнуть подпредставление веб-просмотра (скроллвью).

0 голосов
/ 25 ноября 2009

Я использовал stringByEvaluatingJavaScriptFromString плюс перемещение источника UIWebView. Обзор дизайна: у меня был набор элементов управления (в этом примере UIImage) (я имею в виду frame.origin.y) UIWebView Итак, макет был:

UIView
  UIScrollView
    UIImageView
    UIWebView

Поскольку UIWebView не поддерживает прокрутку в такой иерархии, я изменил ее следующим образом:

UIView
  UIScrollView
    UIImageView
  UIWebView

Мой контроллер представления является делегатом для UIWebViewDelegate и UIScrollViewDelegate. Тогда,

- (void)viewDidLoad
{
  // set delegates
  self.scrollView.delegate = self;
  self.webView.delegate = self;

  // store original UIWebView position in ivar
  webViewPosY = self.webView.frame.origin.y;

  // load html into UIWebView
  [self.webView loadHTMLString:someHTML baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  // get UIWebView size and store in ivar
  webSize = [self.webView sizeThatFits:CGSizeMake(1.0,1.0)];

  // set proper content height for UIScrollView
  CGSize contentSize = self.scrollView.contentSize;
  contentSize.height = webViewPosY + webSize.height;
  self.scrollView.contentSize = contentSize; 

  // set UIWebView's frame height same as UIScrollView has
  CGRect wf = self.webView.frame;
  wf.size.height = self.scrollView.frame.size.height;
  self.webView.frame = wf;
}

// scrolling logic:
// 1.  if origin of UIWebView > 0 then move UIWebView itself
// 2.  if origin of UIWebView == 0 then scroll with javascript
// 3.  if origin is 0 and whole html is scrolled then move UIWebView again(this happens to support scroll "bouncing", or if you have some views below UIWebView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  CGFloat scrollPosY = self.scrollView.contentOffset.y;

  // (1) and (2) ifs
  // how much to move UIWebView
  CGFloat scrollOriginY = (scrollPosY >= webViewPosY) ? webViewPosY : scrollPosY;
  // how much to scroll via JS
  CGFloat scrollJSY = scrollPosY - scrollOriginY;

  // (3) if
  if ( scrollPosY > (webSize.height - scrollViewSize.height + webViewPosY ) )
    scrollOriginY += scrollPosY - (webSize.height - scrollViewSize.height + webViewPosY);

  // scroll with JS
  [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.scrollTop = %f;", scrollJSY]];

  // move UIWebView itself
  CGRect wf = self.webView.frame;
  wf.origin.y = webViewPosY - scrollOriginY;
  self.webView.frame = wf;
}

Это прекрасно работает для меня.

0 голосов
/ 06 июня 2009

Я нашел очень интересный пост об этом, он решил проблему для меня: ссылка ttp: //pinchzoom.com/blog/items/view/1386/one-of-the-problems-with-the-uikit-at-the-moment-is-an-issue-embedding-a- UIWebView-в-таблица

Надеюсь, что поможет

0 голосов
/ 12 мая 2009

У меня такая же проблема. Я помещаю UIWebView внутри большого TableViewCell (> 1024px), и когда я прокручиваю до нижней части ячейки, появляется это серое поле.

Но, если я поставлю UILabel (также с большим размером> 1024px), серого поля не будет. Поэтому я думаю, что это не имеет ничего общего с максимальной высотой UIView (кстати, я не могу ничего найти по этому поводу, так называемая максимальная высота 1024). Я думаю, что это скорее проблема UIWebView.

Для меня решение состоит в том, чтобы перезагрузить содержимое веб-просмотра, когда появится серое поле. На самом деле, у меня просто есть HTMLString для загрузки, поэтому я снова вызываю [webview loadHTMLstring:], и серое поле исчезает.

Надеюсь, что поможет

0 голосов
/ 19 ноября 2008

Я тоже имел дело с этим глюком и открыл отчет об ошибках в apple. Я бы прокомментировал выше, но у меня пока нет 50 повторений.

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

https://bugreport.apple.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...