Iphone 重新绘制UIWebView的内容

Iphone 重新绘制UIWebView的内容,iphone,ios,ipad,Iphone,Ios,Ipad,我有一堆带有静态html内容的Web视图,我将它们作为页面放在滚动视图中。这很好,但滚动视图有20多个全屏子视图会造成一些延迟。我一次只放5个就解决了这个问题。当前视图、两个下一个视图和两个上一个视图 现在的问题是,任何不是滚动视图子视图的web视图都无法根据设备方向正确绘制。webview的框架打印正确,但实际内容是以纵向模式绘制的。所以在内容的右边有一条空白 如何在不重新加载页面的情况下重新呈现内容 以下是相关代码: - (void)didRotateFromInterfaceOrienta

我有一堆带有静态html内容的Web视图,我将它们作为页面放在滚动视图中。这很好,但滚动视图有20多个全屏子视图会造成一些延迟。我一次只放5个就解决了这个问题。当前视图、两个下一个视图和两个上一个视图

现在的问题是,任何不是滚动视图子视图的web视图都无法根据设备方向正确绘制。webview的框架打印正确,但实际内容是以纵向模式绘制的。所以在内容的右边有一条空白

如何在不重新加载页面的情况下重新呈现内容

以下是相关代码:

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

}
-(void)从InterfaceOrientation(接口方向)中删除了RotateFromInterfaceOrientation:(UIInterfaceOrientation){
[自调整大小子视图];
}
-(无效)设置Web视图{
如果(_webViews==nil)
_webViews=[[NSMutableArray alloc]init];
//这就是导航在加载可用web视图时发挥作用的地方
[_webviewsremoveallobjects];
//用于在此处循环以创建web视图
对于(int i=0;i<20;i++){
//CDCWebViewController*webView=[[MyInternalWebView alloc]initWithFrame:[u webViewWrapper.frame]retain];
MyInternalWebView*页面=[[[MyInternalWebView alloc]init]retain];
[页面加载请求:[nsurlRequestRequestWithURL:_url]];
[页面设置cdciwvdelegate:self];
[页面设置索引:i];
[页面设置页面索引:i];
[_webviewsaddobject:page];
[带页面的自动加载滚动视图:i];
}
[self-clearUnusedWebViews:_pageControl.currentPage];
}
-(无效)setupWebViewWrapper{
//页面是滚动视图的宽度
_webViewWrapper.PaginEnabled=是;
_pageControl=[[UIPageControl alloc]init]retain];
_webViewWrapper.showshorizontalscrolindicator=NO;
_webViewWrapper.showsVerticalScrollIndicator=否;
_webViewWrapper.scrollsToTop=否;
_webViewWrapper.delegate=self;
_pageControl.numberOfPages=[\u网络视图计数];
_pageControl.currentPage=0;
}
-(无效)调整子视图的大小{
//帧设置为IB
_webViewWrapper.contentSize=CGSizeMake(\u webViewWrapper.frame.size.width*[\u WebViewCount],\u webViewWrapper.frame.size.height);
//移动内容偏移量。
_webViewWrapper.contentOffset=CGPointMake(_webViewWrapper.frame.size.width*_pageControl.currentPage,_webViewWrapper.contentOffset.y);
对于(MyInternalWebView*子视图在_webViewWrapper.subview中){
//是否在此处重置框架高度和宽度?
CGRect frame=\u webViewWrapper.frame;
frame.origin.x=frame.size.width*subview.pageIndex;
frame.origin.y=0;
[子视图集帧:帧];
}
}
//*****************************************************
//*
//*滚动视图功能
//*
//*****************************************************
-(void)加载滚动视图带页面:(int)页面{
//确保我们不出界
如果(第<0页)返回;
如果(页面>=[[u网络浏览次数])返回;
MyInternalWebView*webView=[\u webViews objectAtIndex:page];
//将预加载的webview添加到scrollview(如果还没有)
如果(nil==[webView superview]){
CGRect frame=\u webViewWrapper.frame;
//NSLog(@“width=%f”,frame.size.width);
frame.origin.x=frame.size.width*页;
frame.origin.y=0;
//NSLog(@“设置第%d页的帧@”,第页,NSStringFromCGRect(帧));
[webView设置框架:框架];
[\u webViewWrapper addSubview:[\u webViews objectAtIndex:page]];
//现在新的已加载,请清除此处不需要的内容
[self clearUnusedWebViews:page];
}
}
-(无效)清除未使用的Web视图:(NSInteger)页面{
对于(int i=0;i<[u网络视图计数];i++){
如果((第一页)
重新加载
重新加载当前页面

- (void)reload
可利用性 在iOS 2.0及更高版本中提供

另见

UIWebView.h


在“调整大小”子视图中,从“web视图”数组更改web视图的框架,而不是滚动视图子视图

增编:

  • 检查scrollViewDidScroll if page!=\u pageControl.currentPage,然后才加载scrollViewsWithPage

  • 方向更改可能会触发scrollViewDidScroll

  • 在clearUnusedWebViews中,使用_pageControl.currentPage而不是page变量。当您在第5个视图中加载第7个视图时,您将删除第4个和第3个视图,即使我认为您的意图是在此时滚动视图中显示3,4,5,6,7


我尝试使用重新加载,但它会导致延迟。我只需要已加载的内容调整到其帧。“[…]而不重新加载页面”所有这些都是很好的修改。但我仍然对内容有相同的问题。当内容添加到滚动视图时,似乎是以纵向模式开始的,并且没有重新绘制。不确定如何在网络视图上强制重新绘制。我知道,如果我更改方向,所有实际附加到scr的网络视图oll视图将调整良好。我已尝试[UIView setNeedsDisplay]但这似乎没有任何作用,因为没有任何事情需要重新绘制。您是否使用UIWebView子类以便将其添加到UIScrollView?我想说UIWebView会在帧更改时重新显示页面。您是否尝试过scalesPageToFit重设?或者更好的做法是了解UIWebView在帧更改时发生了什么。我有一个子类。我尝试了scalesPageToFit重置。它没有做任何事情。UIWebView似乎在帧更改时没有做任何事情。我觉得这很奇怪。UIWebView标头显示该类包含一个指向UIWebViewInternal的指针。更深入地说,UIWebViewInternal是群集继承了很多类,其中UIWebDocumentView似乎是一个类我对你很感兴趣,因为我
  @property request
  @property loading
– loadRequest:
– stopLoading