之前写小说类相关的应用,需要电子书阅读器,在网上找了很久,觉得还是https://github.com/GGGHub/Reader 同学的最好用,所以就拿这个用了。
不过后来发现里面的书签,笔记的定位功能,以及字体变化等功能有点问题,造成阅读者的不愉快,所以特意Fork了一个版本做了相应的修改,大家如果有类似的问题,可以试试我修改后的版本,在这里
https://github.com/Inspirelife96/Reader
如果大家有更好的阅读器,请推荐给我,万份感谢:)
Reader
基于Core Text
实现的iOS客户端的电子书阅读器
。</br>
支持ePub与text格式
2016.10.02 更新 (我做的修改)
针对text小说的bug fix。
- 当字体变化时,小说有时候不会自动调整界面。
- 当字体变化时,还有小说的书签,笔记定位不准确,甚至程序崩溃。3.
大概思路:
- 当字体变化时,所有小说的章节都会基于新的字体重新调整,分页等。
- 记录笔记/书签文字开始位置的在整个章节中的下标位置,笔记/书签定位时,基于当前的字体分页,看当前的下标位置是否坐落在哪一页中,然后跳转到那一页。
2016.06.16 更新 (以下都是LiSiYuan写的,非常好的库,我自认为没有他的水平,大家可以好好学习)
添加对ePub格式的支持
部分功能实现效果
Paste_Image.png
关于Reader</br>
- 可以自动提取章节并生成目录
- 选取一段文字可进行复制,做笔记等功能
- 保存阅读进度,即使退出应用也可以继续之前的阅读
- 更改字体大小,进度跳转,主题更换等功能
- 支持
txt
与ePub
格式的电子书文件
安装与使用
安装
- 将
Reader
目录下的所有文件都添加到工程中</br> - 由于解压
ePub
文件,需要用到开源的.c文件
用于解压缩。所以使用时如果项目中有.pch文件
参考本项目中.pch
文件写法</br>
#ifdef __OBJC__
//在.pch中这里写引用的.h文件与宏
#endif
3.需要导入libz.tbd
库
使用
text文件</br>
LSYReadPageViewController *pageView = [[LSYReadPageViewController alloc] init];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"mdjyml"withExtension:@"txt"];
pageView.resourceURL = fileURL; //文件位置
pageView.model = [LSYReadModel getLocalModelWithURL:fileURL]; //阅读模型
[self presentViewController:pageView animated:YES completion:nil];
ePub文件</br>
LSYReadPageViewController *pageView = [[LSYReadPageViewController alloc] init];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"细说明朝"withExtension:@"epub"];
pageView.resourceURL = fileURL; //文件位置
pageView.model = [LSYReadModel getLocalModelWithURL:fileURL]; //阅读模型
[self presentViewController:pageView animated:YES completion:nil];
提示
之前安装过的下载最新版,应把之前安装的卸载后再安装
说明
对于有图片和定制样式的epub文件只显示纯文本信息,因为对epub每个章节的html文件直接转成字符串来处理,css样式与epub自带的本地图片没有做处理。
网友评论
#pragma mark - Menu View Delegate
-(void)menuViewDidHidden:(LSYMenuView *)menu
{
_showBar = NO;
// [self setNeedsStatusBarAppearanceUpdate];
}
-(void)menuViewDidAppear:(LSYMenuView *)menu
{
_showBar = YES;
// [self setNeedsStatusBarAppearanceUpdate];
}
这两行代码就可以正常显示了,但是状态栏不出来了!这个用另一种方法显示状态栏就好了!谢谢楼主,已解决
已经解决了 mrc需要加-fno-objc-arc
##安装与使用 ###安装
将Reader目录下的所有文件都添加到工程中
由于解压ePub文件,需要用到开源的.c文件用于解压缩。所以使用时如果项目中有.pch文件参考本项目中.pch文件写法
#ifdef __OBJC__
//在.pch中这里写引用的.h文件与宏
#endif
3.需要导入libz.tbd库
你希望一个一个章节load的?我印象中还有一个reader库,做的是按章节load的,我找找啊。找到了,这个https://github.com/TigerWf/WFReader,你如果要按章节load,然后后面的某些章节做成VIP才能阅读,可以参考这个试试。
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSFontAttributeName] = font17;
CGRect bounds = CGRectMake(0, 0, viewWidth, viewHeight);
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:allContentText];
[attrString setAttributes:dict range:NSMakeRange(0, attrString.length)];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) attrString);
CGPathRef path = CGPathCreateWithRect(bounds, NULL);
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(currentInnerOffset, 0), path, NULL);
CFRange range = CTFrameGetVisibleStringRange(frame);
有一个txt文件,在文件的开头有目录列表如下:
第001回 灵根育孕源流出 心性修持大道生
第002回 悟彻菩提真妙理 断魔归本合元神
第003回 四海千山皆拱伏 九幽十类尽除名
第004回 官封弼马心何足 名注齐天意未宁
第005回 乱蟠桃大圣偷丹 反天宫诸神捉怪
第006回 观音赴会问原因 小圣施威降大圣
第007回 八卦炉中逃大圣 五行山下定心猿
第008回 我佛造经传极乐 观音奉旨上长安
附 录 陈光蕊赴任逢灾 江流僧复仇报本。。。。。
在正文的时候也有:
第一回 灵根育孕源流出 心性修持大道生
诗曰:
混沌未分天地乱,茫茫渺渺无人见。
自从盘古破鸿蒙,开辟从兹清浊辨。
这样就造成目录解析错误,这块您了解吗?
在LSYReadPageViewController.m文件中,修改设置字体回调方法:
-(void)menuViewFontSize:(LSYBottomMenuView *)bottomMenu
只更新当前章节的字体,移除for循环:
[_model.chapters[_chapter] updateFont]。
在触发-readViewWithChapter:page:方法的位置,如果是回到上一章节,就更新上一章节的字体:
例如: CatalogViewController Delegate中的
-(void)catalog:(LSYCatalogViewController *)catalog didSelectChapter:(NSUInteger)chapter page:(NSUInteger)page
添加 [_model.chapters[chapter] updateFont];
在Menu View Delegate中的-(void)menuViewJumpChapter:(NSUInteger)chapter page:(NSUInteger)page中添加:
[_model.chapters[chapter] updateFont];
在PageViewController DataSource中的
- (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController中添加
if (_pageChange==0) {
_chapterChange--;
#warning marl --- *******
[_model.chapters[_chapterChange] updateFont];// 添加的代码
_pageChange = _model.chapters[_chapterChange].pageCount-1;
}
您对代码整体更熟悉,帮忙看看,是否存在什么潜在问题。
相信明天你就自己搞定了。或者只能等我回国咯。
-(void)changeFont:(UIButton *)sender
{
if (sender == _increaseFont) {
if (floor([LSYReadConfig shareInstance].fontSize) == floor(MaxFontSize)) {
return;
}
[LSYReadConfig shareInstance].fontSize++;
[LSYReadConfig shareInstance].fontColor = [UIColor redColor];
}
else{
if (floor([LSYReadConfig shareInstance].fontSize) == floor(MinFontSize)){
return;
}
[LSYReadConfig shareInstance].fontSize--;
[LSYReadConfig shareInstance].fontColor = [UIColor greenColor];
}
if ([self.delegate respondsToSelector:@selector(menuViewFontSize:)]) {
[self.delegate menuViewFontSize:self];
}
}
我在这个函数里加了颜色的设置,字体变大,颜色变红,字体变小,颜色变绿。效果是立刻变色的。
所以你可以研究下, [self.delegate menuViewFontSize:self];具体做了什么事情,能够让颜色,自理立刻刷新。大多应该是调用了updateReadModelWithChapter这个函数的结果。(我猜的,具体没有看)。
简单粗暴的话,就是把FontSize变化的逻辑copy一边,然后修改为字体颜色。当然中间可能会有坑。
所以你仔细研究下吧。
举个例子,你当前字体是14,阅读的是第一章第10页的内容。然后把字体变成28(举个例子哦,假设字体翻倍,一页显示的内容减半),这时候还是显示字体28状态下的第10页的内容,也就是字体14第5页的内容。并不是你之前阅读的内容了。
我测了下demo的例子没有吃书的现象啊。我指的是TXT格式,epub我没有用过,不清楚情况。