基本原理
NSLayoutManager
会根据加入的 NSTextContainer
不断分走文字, 直到分完为止, 这时候读书软件源码可以使用 layoutManager.glyphRange(for: textContainer)
获取 NSTextContainer
对应的文字范围 range
, 之后就可以根据这个 range
进行文字分割
修改字色, 字体
改变字色
读书软件源码改变颜色不需要重新尽心分页操作, 直接操作 UITextView
的 attributedText
和原始 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
, 后者会导致其他信息被清空
改变字体
对 UITextView
的 attributedText
和原始 NSAttributedString
的 font
设置为新字体, 再重新进行分页操作, 重新设置单页显示视图即可
注意事项与其他
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 左右
当然, 也有可能是我的方式有错误, 各位可以尝试各种方案, 但分页逻辑万变不离其宗
声明:如有侵权请联系作者删除