Code Monkey home page Code Monkey logo

dzmebookread's Introduction

DZMeBookRead

Version Swift Version Xcode Version Author


技术QQ群: 52181885,麻烦进群之后@群主进微信群(大前端交流群)


一、DEMO 效果(导入项目流程看 第四步

DEMO效果


二、简介与版本记录

提示: 

下载不同版本可在上面的 Branch 选项中选择下载版本, master 分支为最新版本。

v1.3 (Swift4.2) {

    2021-12-28 更新: 支持 DZMCoreText 获取指定页(内容)获取所有断尾 NSRange 或者 CGRect,方便做断尾评论功能。

    2021-11-16 更新: 修复长按选中一个段落,页头页尾无限循环问题,解决 ipad iOS15 放大镜崩溃问题。
    
    2021-11-1 更新: 支持长按选中一个段落内容,或者选中一行内容。

    2021-4-9 更新: 解决放大镜在 iOS 13 之后系统中长按不显示问题,iOS13 以后苹果增加了 SceneDelegate 来管理窗口,必须将自定义 Window 注册到 SceneDelegate 中。
    
    2021-4-9 更新: 优化长按弹出操作菜单代码,解决隐藏操作菜单闪动问题,更新为 Xcode 12.4
    
    2021-4-8 更新: 页尾留白问题解决,新问题:英文阅读单纯被分割,但是按单词分割,页尾则会留白,参考 DZMReadConfigure.swift 文件 242 行。
    
    2020-11-25 更新: 感谢 @dreeye 小伙伴的帮助!!修复滚动模式滚动内容崩溃问题,之前是由于存放章节字典有线程安全问题导致章节对象中途释放出现野指针崩溃,现在已经修复,滚动模式可以正常使用了。 

    2020-11-25 更新:滚动模式崩溃问题:“现在有个BUG在iOS12.2以后, iOS12.2以前到没出现,我这边测试机用的X才会系列会出现,其他机型好像也不会,滚动模式 DZMReadViewScrollController -> chapterModels 字段里面章节model会提前释放,不会被强引用,很是郁闷, 低版本没有问题。拿到Demo的可以测试一下滚动模式下会不会有问题。其实就是章节Model提前释放了,但是我存放的是字典对象,理论上是强引用对象的,现在12.2却出现这样的问题”

    2020-6-15 更新: 加入【平移翻页模式】
}

v1.2 (Swift4.2) { (同上版本)

    2019-5-20 BUG: 滚动模式在iOS12版本以上会出现闪退,原因是字典里面的章节内容对象提前释放了,iOS12以下却没有问题,暂时没有更好的存储方式所以先替换为之前版本存储方式。
    
    2019-5-17 修复: 书籍首页添加标签BUG, 第一次进入创建阅读页多次BUG。

    2019-5-16 更新: 加入TXT全本快速进入阅读。

    2020-3-17 由于系统 UIPageViewController 的点击左右翻页范围太小,且不可自由控制,增加自定义手势开关支持随意控制仿真模式左右翻页菜单的点击区域控制。
}

v1.1 (Swift4.2) { (TXT,有书籍首页)

    2019-5-16 更新: 解析文本,代码细节优化。
    
    2019-5-10 修复: 无效果快速点击BUG。
    
    2019-5-7 更新: 加入书籍首页支持。
}

v1.0 (Swift4.2) { (TXT,无书籍首页)

    2019-4-29 更新: 重做Demo, 升级Swift4.2, 解决遗留问题, 优化代码使用。
}

三、导入项目流程

文件介绍1


四、epub 支持提示

DTCoreText同样也可以解析txt,epub...分页相关的功能,很方便。不需要像我这个Demo中一样复杂的解析处理。当然有喜欢研究CoreText可以参考下我的Demo。

DTCoreText对于epub来说,主要功能就是能够将我们输入的HTML文件进行解析,并自动关联相对应的css样式(也帮我们解析好了),我们需要做的就是输入一个HTML文件,

他就会给我们输出带有排版样式的NSAttributedString,然后我们直接使用CoreText进行画这个NSAttributedString就可以啦!

Github地址:https://github.com/Cocoanetics/DTCoreText

五、项目思路理解:

1. 将一个完整的TXT或者文本解析成一章一章的章节模型,通过归档的模式进行缓存起来(归档解析速度比数据库要快)。

归档缓存方式:

    通过 bookID 和 chapterID 作为文件夹以及文件名进行缓存,

    这样做的话那么只需要面对 bookID 和 chapterID 就可以知道本地是否有这个章节存在以及获取阅读,
    
    同时在网络小说的情况下,你需要通过 bookID 和 chapterID 就在任何位置,或者后台进行缓存下载章节,并同时进行流畅阅读,
    
    只需要在阅读或者下载的时候判断下本地是否存在该章节归档文件就可以避免重复下载。
    
2. 创建一个 readModel, readModel 里面存放的是这本小说的公用属性, 比如阅读记录, 书签, 等等...

   在阅读过程中就是起到一个针对这本小说需要公用属性以及记录属性的作用
   
   那么怎么使用它进入阅读呢? 你只需要通过一个 bookID 获得一个 readModel 对象, 然后使用它里面修改阅读记录的方法, 
   
   将你需要阅读的章节的 chapterID 传进去修改为当前这个 readModel 的阅读记录对象即可, 你修改阅读记录的章节必须存在,
   
   也就是说你是网络小说就要先将要阅读的章节下载到本地归档好, 本地小说就先解析一章到本地归档好, 在使用 readModel 进行修改阅读记录,
   
   然后传给控制器就可以进行阅读了。
   
3. readModel里面的 chapterListModels 是可有可无的, 阅读过程中不依赖章节列表, 也就是说你可以先设置章节列表, 也可以删除不使用,

   也可以在 DZMRMLeftView 里面去单独请求这个章节列表的数据, 它的作用只是用于手动选章节的使用得到一个 chapterID 进行加载并缓存阅读而已,
   
   一般 chapterModel 里面就已经带好了当前章节ID以及上下章章节ID。
   
4. 网络小说使用:
    
   1).进入阅读页的时候获取一个你要阅读的 chapterID, 这个 chapterID 的章节内容需要存在本地归档文件里面, 并通过 readModel 修改为阅读记录对象,就可以传入控制器进行阅读了。
   
   2).然后在上下翻页里面根据 chapterID 判断是否有归档文件, 没有就下周并缓存, 修改为阅读记录进行继续阅读, 如果不知道在哪里修改, 全局搜索 "网络小说操作提示", 可以看注释。
   
   3).边下载边看这个操作就可以看上面 1. 的提示了。
   
   4).章节归档处理的 增删改查 都已经封装, 可以直接使用 在 DZMKeyedArchiver.swift 文件中下面。

六、附带信息

dzmebookread's People

Contributors

dengzemiao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dzmebookread's Issues

网络小说点击切换上一章会在这里崩溃

pageViewController.setViewControllers([displayController, GetReadViewBGController(recordModel: displayController?.recordModel, targetView: displayController?.view)], direction: direction, animated: animated, completion: nil)

网络小说的一些问题

网络小说的话,可以考虑下预加载的问题。(前一章,后一章)
还有就是网络小说直接分为已下载和未下载,会存在更新的问题。所以翻页最好不根据是否是网络小说,而应该根据需要跳转的章节是否本地归档过,缓存了的话就从本地获取,否则的话从网络获取。
一个建议 : )

为什么不直接使用TextView?

请教一下,为什么不选择使用textView作为文本的承载视图而采取自己绘制的方式展示内容?其中有什么权衡吗?

段落的首行缩进怎么处理

@dengzemiao 你好

如果我是下载的纯文本TXT,然后排版的时候,采用的
// 参数:首行缩进两个字符
CGFloat emptylen = config.fontSize*2;
paragraphStyle.firstLineHeadIndent = emptylen;//首行缩进

就会出现,本页的这段如果没有显示完全,会在下一页的首段也被缩进了,

怎么处理这个段落的首行缩进2个字符的问题。

谢谢大神

快速点击时,翻页重复问题

仿真模式下,快速点击右侧或左侧区域,发现页面虽然发了两次,但是内容只翻了一页,在下面这个方法中操作之后

// file: DZMReadOperation.swift
func GetBelowReadViewController() ->UIViewController? {
    ...
    readRecordModel?.page = NSNumber(value: (page + 1))
}

发现
vc.readModel.readRecordModel.page 并没有变化

关于增加自动阅读功能的思路,以及tts的功能

你好,我最近在研究怎么实现qq阅读的自动阅读功能和tts语音阅读这两部分,其中一个共同地方就是增加定时器来自动执行阅读本章内容,然后渲染下一章节。对于这部分实现,之前看来UIPageViewController这个有setVIewControllers来控制阅读,但是使用起来不是很方便,不知道你有没有什么好的思路?谢谢

怎么更新当前的页面数据

我已经把你的程序改成读取在线目录文件,然后解析,多个文件章节的形式,但是不知道当前的章节内容下载完后怎么更新页面

然后你有没有计划改成每个章节一个文件的

上下滑动, 章与章切换卡顿

邓大神, 你的代码我仔细研究过了, 翻页方式是上下滑动时, 章与章的切换(即新的cell生成时)会造成主线程阻塞而卡一下. 我试过把一章当一个secsion, 一页当一个cell, 一页一页地绘制字符串, 虽然没那么卡了, 但还是会卡, 请问大神你有什么好的解决方法吗 ??? 急用 ! 谢谢 !!! 如果邓大神能加一下我的qq(779071985破浪)指点一下就更好了.我把你整个项目OC化了

我把绘制字符串的代码贴出来, 麻烦你帮忙看看有没有毛病, 谢谢!

CGRect redFrame = DrawRectForScrollRead;

// 步骤1:得到当前用于绘制画布的上下文,用于后续将内容绘制在画布上
// 因为Core Text要配合Core Graphic 配合使用的,如Core Graphic一样,绘图的时候需要获得当前的上下文进行绘制
CGContextRef context = UIGraphicsGetCurrentContext();

// 步骤2:翻转当前的坐标系(因为对于底层绘制引擎来说,屏幕左下角为(0,0))
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

// 步骤3:创建绘制区域
CGPathRef path = CGPathCreateWithRect(redFrame, nil);

// self.content 是 NSAttributeString 类型
if (self.content.length == 0 || self.content == nil) {
    // 步骤7.内存管理
    CFRelease(path);
    return;
}

// 步骤4:创建需要绘制的文字与计算需要绘制的区域
NSDictionary *contentAtt = [BWCSReadConfigureManger contentAtt];
NSMutableAttributedString *contentStr = [[NSMutableAttributedString alloc] initWithString:[self.content string] attributes:contentAtt];

// 步骤5:根据AttributedString生成CTFramesetterRef
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)contentStr);
CTFrameRef frameRef = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil);

// 步骤6:进行绘制
CTFrameDraw(frameRef, context);

// 步骤7.内存管理
CFRelease(frameRef);
CFRelease(path);
CFRelease(frameSetter);

下载小说

请问作者有预留,下载小说的接口?或者相关思路在代码中有体现么

网络小说能写个demo吗

大佬 网络小说能写个demo吗 网络请求接口的地方你直接用字符串代替吧 这样接口就不暴露了,初次写swift还不是很熟练,求助 求助!!!

有几个疑问和建议不知道可以说说不

解析的txt文本是有换行和缩进的对吧。然后你通过计算字体大小和屏幕大小计算出每页需要显示的文字,然后根据需要的格式将文字渲染到了屏幕上,所以第一次会很慢对吧。那之后翻页的时候之前解析的章节从内存中remove掉了么?如果还在内存里为什么滑动的时候会慢呢。
不过如果是网络小说的话是否就会不会卡顿了,因为都是从网络下载好的章节,只需计算每页显示的内容就好了。而且数据量会小一些,就算是缓存了的也是结构好了的数据比较容易计算

大牛!

如果有OC就更完美了,不过已经挺好了,赞!!!

能不能优化,加载速度越来越慢!

解析出来第一章就会要你进入阅读, 别的章节都在后台解析。
能不能优化,现在加载速度慢,有点文字多点的文章就卡死了。。。。
我把他改成网络图书的,但是基本解析的地方没改。。。。
怎么优化,那个类,请教一下,谢谢!

集成遇到这种问题,不知怎么解决While emitting SIL for

集成遇到这种问题,不知怎么解决

  1. While emitting SIL for 'layoutSubviews()' at /Users/jordan/Documents/OtherProject/2018Git/QuanZhiGaoShou/Master/DZMeBookRead/other/custom/DZMSegmentedControl.swift:246:14

  2. While silgen emitFunction SIL function "@_T06Master19DZMSegmentedControlC14layoutSubviewsyyF".
    for 'layoutSubviews()' at /Users/jordan/Documents/OtherProject/2018Git/QuanZhiGaoShou/Master/DZMeBookRead/other/custom/DZMSegmentedControl.swift:246:14

  3. While emitting SIL for 'layoutSubviews()' at /Users/jordan/Documents/OtherProject/2018Git/QuanZhiGaoShou/Master/DZMeBookRead/menuUI/DZMRMLeftView.swift:100:14

  4. While silgen emitFunction SIL function "@_T06Master13DZMRMLeftViewC14layoutSubviewsyyF".
    for 'layoutSubviews()' at /Users/jordan/Documents/OtherProject/2018Git/QuanZhiGaoShou/Master/DZMeBookRead/menuUI/DZMRMLeftView.swift:100:14

不支持epub格式?

是不是只支持.txt格式的电子书阅读?

那功能太有限了。

还有就是希望加入划线、标记颜色和笔记等功能。

求大神更新

能不能加上以划线或者涂色为书签的功能,类似于微信读书和百度阅读的那种,这就完美了,我自己尝试着改了改,但是自己对Swift不是很熟,希望大神能更新,期待!

加载text文件崩溃

你好:
我在网上下了一个text文档格式的小说,使用您的demo解析的时候发现可以解析成功章节目录,但是在
DZMReadController控制器的 216行pageViewController!.setViewControllers((displayController != nil ? [displayController!] : nil), direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)这里会崩溃,本人才学swift不久,没能找到原因。希望得到您帮助。感谢

有声阅读

请问开发者可以自行添加有声阅读功能么?作者有没有预留一些接口之类的(作者是否有预留:获取当前小说内容页面的文字功能)?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.