UIScrollView 上的多个 UIWebView-s

Posted

技术标签:

【中文标题】UIScrollView 上的多个 UIWebView-s【英文标题】:multiple UIWebView-s on a UIScrollView 【发布时间】:2012-01-12 12:48:26 【问题描述】:

我正在试验我开发的一种杂志类型的 iPad 应用程序,但遇到了内存问题。 UIScrollView 上有多个 UIWebView-s。每个 UIWebView 都显示一个来自 html 文件源的 html 页面。不幸的是,一旦应用程序加载,我找不到处理 web 视图以在后台顺利加载它们的解决方案,而不是加载并触发每个 html 页面及其所有 javascript 和图像,因为我希望它们一次可见我在它们上滑动,但是我在 30 个面板上收到“收到内存警告”消息并且应用程序中断。

我用来显示网页视图的代码是这样的:

NSInteger numberOfViews = 47;
for (int i = 0; i < numberOfViews; i++) 
    CGFloat yOrigin = i * 768;
    DetailViewController *detailViewController2 = [[DetailViewController alloc] initWithNibName:@"Detail" bundle:nil];

    [detailViewController2.view setFrame:CGRectMake(yOrigin, 0, 768, 1024)];
    detailViewController2.view.clipsToBounds = YES;
    [scroll.view insertSubview:detailViewController2.view atIndex:0];        


scroll.scrollView.contentSize = CGSizeMake(768 * numberOfViews,1004);
scroll.pageControl.numberOfPages = numberOfViews;

self.view.clipsToBounds = YES;
self.view.clearsContextBeforeDrawing = YES;
CGRect frame;
frame.origin.x = scroll.scrollView.frame.size.width * scroll.pageControl.currentPage;
frame.origin.y = 0;
frame.size = scroll.scrollView.frame.size;
[scroll.scrollView scrollRectToVisible:frame animated:NO];
self.scrollViewController = scroll;
[self.view insertSubview:scroll.view atIndex:0];

- (void)dealloc 
    [scrollViewController release];
    [tableOfContentsViewController release];

    [portrait release];
    [tableOfContents1 release];
    [start release];

    [super dealloc];

显示html内容的代码在DetaildViewController里面:

NSString *htmlPath = [[NSBundle mainBundle] pathForResource:htmlfilename 
                                                         ofType:@"html" 
                                                    inDirectory:@"/htdocs" ];

    NSString *html = [NSString stringWithContentsOfFile:htmlPath 
                                               encoding:NSUTF8StringEncoding 
                                                  error:nil];

    web.delegate = self;
    [web setMultipleTouchEnabled:YES];
    [web loadHTMLString:html 
                baseURL:[NSURL fileURLWithPath:
                         [NSString stringWithFormat:@"%@/htdocs/", 
                          [[NSBundle mainBundle] bundlePath]]]];

- (void)dealloc 
    //---release the memory used by the property---
    [page release];


    [web setDelegate:nil];
    [web stopLoading];
    [web release];


    [orientation release];
    [page release];

    [super dealloc];

问题是我如何才能在 UIScrollView 的背景中顺利加载它们,并且只有在面板弹回视口时才触发 javascript,我打算用它的 html 页面显示 60 多个 webview?

【问题讨论】:

【参考方案1】:

您需要回收视图。当一次只有一个视图可见时创建一堆视图不是一个好策略。苹果有一些关于这个主题的长视频教程。基本思想是最多使用 3 或 4 个视图(UiWebViews)。当您滑动并且视图边界变得可见时,您将对其进行初始化。当它不再可见时,您将其销毁。华尔街日报 iPad 和 iPhone 应用程序使用了类似的模式。 以下是一些资源和教程的链接: Are there any good UIScrollView Tutorials on the net?

【讨论】:

你有苹果视频的链接:回收网络视图吗?

以上是关于UIScrollView 上的多个 UIWebView-s的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 UIImageViews 添加到分页 UIScrollView?

需要帮助在故事板上的 UIScrollView / UIPageControl 中推送视图

在 UIScrollView 上放大时 UIButton 边框消失

水平 UIScrollView 中的多个垂直滚动 UIScrollView

UIScrollView 上的 UITapGestureRecognizer

UIViewController 上的 UIScrollView