品牌官方网站建设,健康义乌app,银行crm系统,贵阳seo网站推广优化六个月前在这个YHEpubDemo阅读器的基础上做了一些优化#xff0c;这里做一下记录。 1.首行缩进修复
由于分页的存在#xff0c;新的一页的首行可能是新的一行#xff0c;则应该缩进#xff1b;也可能是前面一页段落的延续#xff0c;这时候不应该缩进。YHEpubDemo基于XDS…六个月前在这个YHEpubDemo阅读器的基础上做了一些优化这里做一下记录。 1.首行缩进修复
由于分页的存在新的一页的首行可能是新的一行则应该缩进也可能是前面一页段落的延续这时候不应该缩进。YHEpubDemo基于XDSReaderXDSReader目前存在新页首行没有缩进的问题。
修复方案如下
原来预排版分页后将每一页的富文本设置给XDSReadView这样就失去了排版的连续性。现在改为将整个章节的富文本设置给XDSReadView并且对该页需要显示的文本范围进行布局。
在XDSReadView.m的reloadView底部加上以下代码
CGRect rect UIEdgeInsetsInsetRect(self.readTextView.bounds, self.readTextView.edgeInsets);DTCoreTextLayoutFrame *layoutFrame [self.readTextView.layouter layoutFrameWithRect:rect range:_pageRange];self.readTextView.layoutFrame layoutFrame;
因为前面我们已经给readTextView设置了整个章节的富文本
self.readTextView.attributedString self.readAttributedContent;
因此我们这里要根据布局区域的大小和布局文本的范围使用layouter来产生一个layout frame。这样产生的布局是具有连续性的。如果仍然使用原来分页的方式的话需要判断当前页第一行开始处是否位于上一页的段落中。如果不在其中而是新的段落就要获取上一页段落的样式中的headIndent将其设置给当前页第一行样式中的firstLineHeadIndent。
2.CSS rem修复
XDSReader基于DTCoreTextDTCoreText有自己的css和HTML解析器但是不支持css的rem特性这样会导致字体大小有问题。由于DTCoreText没有提供root element上下文目前暂时将rem当em处理虽然会有一些误差但不至于字体大小变1pt。
3.树形目录
根据epub规范我们是可以解析获得任意多级的目录的。考虑到目录可以折叠展开当我们获得了树形数据结构后我们可以使用BFS宽度优先遍历来实现目录的打平
- (void)reloadData
{self.catalogs [NSMutableArray arrayWithArray:CURRENT_BOOK_MODEL.catalog.children];NSMutableArray *q [NSMutableArray arrayWithArray:CURRENT_BOOK_MODEL.catalog.children];while (q.count 0) {XDSCatalogueModel *top q[0];[q removeObjectAtIndex:0];if(top.isExpand){[q addObjectsFromArray:top.children];NSInteger idx [self.catalogs indexOfObject:top];if(idx NSNotFound){idx -1;}[self.catalogs insertObjects:top.children atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(idx1, top.children.count)]];}}[self.tableView reloadData];
}
首先我们将一级目录节点加入临时数组和结果数组如果当前临时数组数组不为空则取出第一个并且从临时数组中移除。如果这个节点是展开的就把这个节点的子节点加入临时数组。现在我们从结果数组中找到这个节点的位置将它的子节点按顺序插入后面。像这样往复前面的操作直到临时数组为空为止。最终我们得到了一个平坦的列表。
4.增加页码
增加页码就是在预排版和分页时需要记录每一个章节的页码范围每一页的文字范围等然后据此计算页面所在的页码以及页码所在的文字范围等。
5.textblock背景色修复
源码中会给textblock设置一个难看的深蓝色的背景色在我们的修复中会首先尝试获取textblock的背景色没有的话才设置为白色 CGColorRef color [textBlock.backgroundColor CGColor];if(!color){color [[UIColor whiteColor] CGColor];}
6.其他
另外对阅读进度记录添加note也做了一些修复。增加了水平滚动翻页类型。
最终的效果 源码GitHub - Mamong/YHEpubDemo: Epub 阅读器 后续考虑使用Swift重写并将epub解析部分抽取出来。