基本原理

NSLayoutManager 会根据加入的 NSTextContainer 不断分走文字, 直到分完为止, 这时候读书软件源码可以使用 layoutManager.glyphRange(for: textContainer) 获取 NSTextContainer 对应的文字范围 range, 之后就可以根据这个 range 进行文字分割

修改字色, 字体

改变字色

读书软件源码改变颜色不需要重新尽心分页操作, 直接操作 UITextViewattributedText 和原始 NSAttributedString 就行

let attributed = NSMutableAttributedString(attributedString: textView.attributedText!)
attributed.addAttribute(.foregroundColor, value: ChangeColor, range: .init(location: 0, length: attributed.length))
textView.attributedText = NSAttributedString(attributedString: attributed)

注意, 方法为 addAttribute, 而不是 setAttribute, 后者会导致其他信息被清空

改变字体

UITextViewattributedText 和原始 NSAttributedStringfont 设置为新字体, 再重新进行分页操作, 重新设置单页显示视图即可

注意事项与其他

UITextView 内间距

请通过 textContainerInset 设置间距, 与分页时的参数保持一致, 单独设置 contentInset 不保证显示正确

添加点击区域

直接在根视图添加点击手势, 设置代理后, 根据点击区域判断行为 这样可以避免 UIPageViewController 的翻页手势被遮挡

在 UIPageViewController 中添加 UISlider 等带有活动操作的视图

请自主做好手势冲突的处理, 不然就是一片乱

分页性能

由于分页流程主要在主线程上, 所以被分页的数据最好不要过大, 单章单章分页就刚刚好

分页后文字可能超出显示区域

每个 NSTextContainer 的 frame 值都是被 NSLayoutManager 粗略计算过的, 与你设置 NSTextContainer 的 size 值略有出入, 有时候大些, 有时候小些, 但误差绝度不会超过一个字符的高度. 所以, 苹果建议我们在设置 UITextView 的时候, 给这个 NSTextContainer 预留一定的高度......

还有字体问题, 因为系统有些字体对中文支持不太好, 可能会对文字的大小计算失误, 请尽量使用以下支持中文的字体, 或其他支持中文的自定义字体:

Heiti SC              黑体-简
Heiti TC              黑体-繁
PingFang TC           平方-简
PingFang HK           平方-繁
PingFang SC           平方-繁

快速翻页导致未分页完成就翻到下一章

可以添加分页中标记, 存在标识时, 下一页上一页代理中返回 nil

读书软件源码的具体判断逻辑请根据自身项目调整

为何不直接使用分页循环中的 UITextView

可以尝试一下, 内存的飙升绝对酸爽, 我在模拟器上测试, 翻了几页直接飙到 150+ M, 目前的方案在模拟器上读书软件源码 整体内存占用最高稳定在 50 M 左右, 真机可以稳定在 20 M 左右

当然, 也有可能是我的方式有错误, 各位可以尝试各种方案, 但分页逻辑万变不离其宗
声明:本文由云豹科技转发自Norld博客,如有侵权请联系作者删除

读书软件源码,实现书籍阅读的其他功能相关推荐

  1. android 带记忆功能的播放器源码,Android实现阅读进度记忆功能

    本文实例为大家分享了android控件webview实现保存阅读进度的具体代码,供大家参考,具体内容如下 用户提了一个要求,要求保存他的阅读进度,然后在他下次阅读的时候可以继续阅读,然后动手实现了一下 ...

  2. android 软件源码

    转自 http://www.cppblog.com/life02/archive/2011/11/23/160837.aspx android 软件源码 android PDF 阅读器 http:// ...

  3. 仿比心一对一直播软件源码开发,消息通知功能的实现

    在仿比心一对一直播软件源码中,消息功能起着非常重要的作用,非实时性的社交都可以通过消息功能来实现,在即时消息模块有两个基本功能就是发送消息和接收消息.我们定义如下通信指令来实现这两个功能: Push ...

  4. 视频交友直播软件源码开发的必备功能讲解

    相信通过这两年行业的发展我们不难看出.视频交友直播源码拥有简单直接的变现方式,深受平台和用户的喜爱,越来越多的年轻人也热衷于视频直播. 视频交友直播软件开发,支持用户在视频过程中用文字沟通,可以互相发 ...

  5. jdk源码分析书籍 pdf_如何阅读源码?

    点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首 ...

  6. 论文阅读笔记——基于CNN-GAP可解释性模型的软件源码漏洞检测方法

    本论文相关内容 论文下载地址--Engineering Village 论文阅读笔记--基于CNN-GAP可解释性模型的软件源码漏洞检测方法 文章目录 本论文相关内容 前言 基于CNN-GAP可解释性 ...

  7. 计算机毕业设计Java校园疫情防控管理软件(源码+系统+mysql数据库+Lw文档)

    计算机毕业设计Java校园疫情防控管理软件(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java校园疫情防控管理软件(源码+系统+mysql数据库+Lw文档) 本源码技术栈: 项目架构:B ...

  8. 顾客信息表mysql_Qt5.5.0使用mysql编撰小软件源码讲解-顾客信息登记表_mysql

    Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介 ...

  9. java计算机毕业设计校园疫情防控管理软件源码+数据库+系统+lw文档+部署

    java计算机毕业设计校园疫情防控管理软件源码+数据库+系统+lw文档+部署 java计算机毕业设计校园疫情防控管理软件源码+数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

最新文章

  1. 数据库事务的四个隔离级别浅析
  2. 计算机基础18春在线作业1,东师-计算机应用基础18春在线作业1-1.docx
  3. java的沙盒安全模式_Java沙箱机制
  4. Qt + Python + OpenCV图标替换工具 之 Qt界面设计(四)
  5. C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)
  6. linux软件管理(yum,rpm)
  7. Java Interview Questions
  8. 你不可不知的HTML优化技巧
  9. (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】
  10. 算法设计与分析(第2版)屈婉玲 刘田 张立昂 王捍贫编著 第一章课后习题答案
  11. Xcode 9以下(xip) 官方直接下载地址(离线下载)
  12. 好用!不用第三方工具就可以检测微信好友是否删除!
  13. CCNA题库第一部分
  14. c计算机怎么读音发音英语,CACD是什么意思
  15. 通达oa2015 php解密,通达OA /interface/auth.php SQL注入
  16. html圆角半径,CSS3 / 绘制四个角不同半径的圆角边框 - 汇智网
  17. fabric java sdk解析channel.queryTransactionByID(txId)方法的返回值
  18. 三点运算符(三点语法)
  19. python爬取酷狗音乐url_python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟...
  20. FLV 格式:为什么直播首选这个流媒体格式?丨音视频基础

热门文章

  1. android:添加usb键盘+按键布局和映射的修改
  2. 2021年全球与中国油位计行业市场规模及发展前景分析
  3. 一体化低压伺服电机在写真机上的应用
  4. WDS2期第24课 1 IIC 驱动框架 adapter和drv 最终drv的attach_adapter的i2c_probe中adapter.master_xfer确定设备然后function
  5. AIGC 的一些应用场景
  6. MavenFor this reason, future Maven versions might no longer support building such malformed projects
  7. XZY数据结构基础(1)
  8. 一个VB小程序,提醒自己上下班打卡和每小时休息
  9. 温度检测之运算放大器
  10. 如何看待矿池抽税激励社区开发者?如何看待EOS?——BCH极客大赛江卓尔专访...