如何在iOS中呈现大尺寸文档?

如何在iOS中呈现大尺寸文档?,ios,objective-c,uitextview,core-text,Ios,Objective C,Uitextview,Core Text,我正在从事一个阅读器项目,目前我正在解析XML文件并将其转换为属性字符串,然后在CoreText(使用apple)中呈现它 XML文件大小超过6 MB。文本被正确呈现,但是我不能呈现图像和表格(比如html表格) 同时,我需要管理绩效。我也尝试过UITextView,但它只显示四分之一的文本,之后文本就会消失 是否有其他技术可以渲染文本、图像和表格? 另一方面-客户不希望使用UIWebViewUICrollView可能是唯一的可能性。将文档分为多个部分,并放入UIScrollView类UITex

我正在从事一个阅读器项目,目前我正在解析XML文件并将其转换为属性字符串,然后在CoreText(使用apple)中呈现它

XML文件大小超过6 MB。文本被正确呈现,但是我不能呈现图像和表格(比如html表格)

同时,我需要管理绩效。我也尝试过
UITextView
,但它只显示四分之一的文本,之后文本就会消失

是否有其他技术可以渲染文本、图像和表格?


另一方面-客户不希望使用
UIWebView

UICrollView可能是唯一的可能性。将文档分为多个部分,并放入UIScrollView类UITextView、UIImageView和UITableView的相应子视图中。若要降低内存影响,请仅放置那些实际可见的子视图

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self removeSubViews];
    [self addSubViews];
}

- (void)removeSubViews {
    for (UIView *subView in documentScrollView.subviews) {
        [subView removeFromSuperview];
    }
}

- (void)addSubViews {
    NSArray* visibleSubViews = [self getAllSubViewsThatAreVisible];
    for (UIView *subView in visibleSubViews) {
        [documentScrollView addSubview:subView];
    }
}

- (NSArray*)getAllSubViewsThatAreVisible {
    NSMutableArray* arrayOfSubViews = [[NSMutableArray alloc] init];
    NSArray* arrayOfVisibleComponents = [self getAllVisibleComponents];
    for (NSDictionary *component in arrayOfVisibleComponents) {
        //there you have to create new UITableView, UITextView, or UIImageView according to what is needed and put this new component into arrayOfSubViews
    }
    return arrayOfSubViews;
}

- (NSArray*)getAllVisibleComponents {
//this is hard to tell how it should be written as I do not know your data. Lets assume, that you have an array of NSDictionary objects. Check all objects in this array, whether they can be visible or not. You shall know their future coordinates in scrollView, while in scrollView, you get visible part by usig property named contentOffset, which will give you top left corner coordinate and by using also property frame.size, you get whole visible rectangle
}

完成此操作并进行测试后,您可以通过不删除所有子视图并保留那些仍然可见的子视图来对其进行优化。第二个优化是根据Y坐标划分组件数组,这样您就不必总是迭代整个庞大的数组。第三个优化是,您不会在每次小滚动后都重新绘制,而是会放置一些实际上不可见但靠近可见区域的组件,滚动后首先检查是否需要重新绘制。

在处理如此大的文件时,您可能会多次显示数据。以下是几种解决方案:

  • 按页面分页:将文件拆分为10个部分(举个例子),并在UITextView中以第一部分显示。添加两个UIButton实例,以便读者可以切换页面。在页面更改时,将第一个/下一个部分加载到UITextView中。这对用户来说并不是特别陌生,因为你是在复制他们阅读电子书的自然方式。要确定您应该将数据分成多少部分,请注意用户不希望连续切换页面,您必须注意调整

  • 对显示进行“平滑”分页:如上所述,您可以按页面分页,但您将始终处理嵌入ScrollView中的两个UITextView。与iOS在UITableView中重用单元和按需加载单元数据(延迟加载)的方式相同,使用两个UITextView实例实现此可重用机制-要快速进行,可以尝试使用标准UITableView实现该机制

希望这有帮助

您还没有详细说明XML文件中编码的文档的结构。它可以是非常复杂的HTML层次结构,也可以是简单的线性文本段落,中间点缀着图像和表格

假设是后者,我喜欢斯威皮和征服者的方法。但我可能会尝试使用UITableView并为每个文档构造创建单元格类型—段落、图像和表格。使用UILabel和UIImage视图来呈现内容,段落和图像将很容易实现。表可能更难,但我可能会利用UIWebView或WKWebView仅呈现表

您需要将XML解析为某种结构或支持存储,在其中可以通过线性索引查找给定的文档结构。假设一个巨大的文档,我会倾向于SQLite或CoreData


滚动将是平滑的。表格将在单元格可见时加载单元格,并在滚动到屏幕外时卸载单元格。

我的文档是
XML
格式,太大了。如果我为每个应用程序创建子视图,应用程序将因内存压力而崩溃。我们可以显示,all in
UITextView
是否有可能将子视图添加到UITextView(现在只需要UITableView和UIImageView)中?呈现大文本会导致应用程序内速度缓慢。我的文件将有4300000多行。在仅放置可见的子视图并在滚动后删除它们时,是否使用UIScrollView?这可能很慢,但对于大型文档来说应该是可以预期的。是的,这可能是一个可行的解决方案。但是没有资源来实现这个方法。我在搜索后尝试过,你是否检查过这个库或这个@MustafaIbrahim它只是一个
XML
解析器。我在解析方面没有任何问题。我正在使用
NSXMLParser
。问题是在视图中进行渲染。能否确保图像或表格旁边不会有文本,并且所有内容都将按垂直顺序排列?即使客户端不需要UIWebView(不知道为什么),它也是满足您需要的最佳解决方案!我用它来显示大量的文本和数据,内存占用比UITextView低20倍。客户端要求长时间平滑滚动。这种方法不适合我的项目,你能提供一些例子吗?我在网上搜索,没有找到任何资源扫描你提供给我的一个大文件,它的大小与你需要显示的文件相当?(可以帮助你)它只创建了150个段落,我有10倍大的文件在处理它,我生成了150个段落,然后复制粘贴了4次!