Перерисовка содержимого UIWebView - PullRequest
0 голосов
/ 19 мая 2011

У меня есть несколько веб-просмотров со статическим HTML-контентом, которые я помещаю в виде прокрутки в виде страниц. Это прекрасно работает, но наличие 20 полноэкранных подпредставлений прокрутки вызывает некоторую задержку. Я решил это, поместив только 5 за один раз. Текущее представление, а также два следующих и два предыдущих.

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

Как мне перерисовать контент без перезагрузки страницы?

Вот соответствующий код:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation{
    [self resizeSubViews];
}


- (void) setupWebViews{

    if(_webViews == nil)
        _webViews = [[NSMutableArray alloc] init];

    // This is where the navigation would come into play as far as loading up available web views
    [_webViews removeAllObjects];

    // for loop here to create web views
    for (int i = 0; i < 20; i++) {

        //CDCWebViewController *webView = [[[MyInternalWebView alloc] initWithFrame:_webViewWrapper.frame] retain];

        MyInternalWebView *page = [[[MyInternalWebView alloc] init] retain];


        [page loadRequest:[NSURLRequest requestWithURL:_url]];
        [page setCdcIWVdelegate:self];

        [page setTestIndex:i];
        [page setPageIndex:i];

        [_webViews addObject:page];

        [self loadScrollViewWithPage:i];
    }

    [self clearUnusedWebViews:_pageControl.currentPage];
}

- (void) setupWebViewWrapper{

    // a page is the width of the scroll view
    _webViewWrapper.pagingEnabled = YES;

    _pageControl = [[[UIPageControl alloc] init] retain];

    _webViewWrapper.showsHorizontalScrollIndicator = NO;
    _webViewWrapper.showsVerticalScrollIndicator = NO;
    _webViewWrapper.scrollsToTop = NO;
    _webViewWrapper.delegate = self;

    _pageControl.numberOfPages = [_webViews count];
    _pageControl.currentPage = 0;

}

- (void) resizeSubViews{

    // The frame is set in IB
    _webViewWrapper.contentSize = CGSizeMake(_webViewWrapper.frame.size.width * [_webViews count], _webViewWrapper.frame.size.height);

    // Move the content offset.
    _webViewWrapper.contentOffset = CGPointMake(_webViewWrapper.frame.size.width * _pageControl.currentPage, _webViewWrapper.contentOffset.y);

    for (MyInternalWebView *subview in _webViewWrapper.subviews) {
        // Reset the frame height and width here?
        CGRect frame = _webViewWrapper.frame;
        frame.origin.x = frame.size.width * subview.pageIndex;
        frame.origin.y = 0;
        [subview setFrame:frame];
    }

}



//*****************************************************
//*
//*         ScrollView Functions
//*
//*****************************************************

- (void)loadScrollViewWithPage:(int)page {

    // Make sure we're not out of bounds
    if (page < 0) return;
    if (page >= [_webViews count]) return;

    MyInternalWebView *webView = [_webViews objectAtIndex:page];

    // Add the preloaded webview to the scrollview if it's not there already
    if (nil == [webView superview]) {
        CGRect frame = _webViewWrapper.frame;

        //NSLog(@"width = %f", frame.size.width);

        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;

        //NSLog(@"setting frame for page %d %@", page, NSStringFromCGRect(frame));

        [webView setFrame:frame];
        [_webViewWrapper addSubview:[_webViews objectAtIndex:page]];

        // Now that the new one is loaded, clear what doesn't need to be here
        [self clearUnusedWebViews:page];
    }


}

- (void) clearUnusedWebViews: (NSInteger) page{

    for (int i = 0; i < [_webViews count]; i++) {

        if ((page - i) <= 2 && i - page <= 2) {
            continue;
        }

        [[_webViews objectAtIndex:i] removeFromSuperview];
    }

}



- (void)scrollViewDidScroll:(UIScrollView *)sender {

    // Switch the indicator when more than 50% of the previous/next page is visible
    CGFloat pageWidth = _webViewWrapper.frame.size.width;
    NSInteger page = floor((_webViewWrapper.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    _pageControl.currentPage = page;

    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
    [self loadScrollViewWithPage:page - 2];
    [self loadScrollViewWithPage:page - 1];
    [self loadScrollViewWithPage:page];
    [self loadScrollViewWithPage:page + 1];
    [self loadScrollViewWithPage:page + 2];

}

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

В resizeSubViews изменяйте фреймы веб-представлений из массива _webViews, а не прокручивайте подпредставления представления.

Приложение:

  • Поставьте галочку в scrollViewDidScroll, если page! = _PageControl.currentPage, и только потом загружайте scrollViewsWithPage.

  • Изменение ориентации может и, вероятно, вызовет scrollViewDidScroll.

  • В clearUnusedWebViews используйте _pageControl.currentPage вместо переменной страницы. Когда вы находитесь на 5-м представлении и загружаете 7-е, вы удаляете 4-е и 3-е места, даже если бы я сказал, что вы хотите иметь 3,4,5,6,7 в режиме прокрутки в это время.

0 голосов
/ 19 мая 2011

перезарядка

Перезагрузка текущей страницы.

- (void)reload

Наличие

Доступно в iOS 2.0 и более поздних версиях.

См. Также

  @property request
  @property loading
– loadRequest:
– stopLoading

Объявлено в

UIWebView.h

Справочник по классам UIWebView

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