本文主要是介绍iOS使用CoreText完成txt阅读器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍几个关键方法
由属性字符串得到CTFramesetter
- CTFramesetterCreateWithAttributedString(att as CFAttributedString)
CTFramesetter是NSAttributedString的CF对象,可以直接强转;
生成CTFrame
- CTFramesetterCreateFrame(framesetter, CFRangeMake(pageStart, 0), path, nil)
CTFrame是排版数据,由CTFramesetter生成;
计算分页
- CTFrameGetVisibleStringRange(frame)
通过上面的介绍,把这几个函数连起来,就是数据准备阶段的核心方法:
- 根据txt内容生成framesetter,
- 根据页面大小计算生成单页的CTFrame
- 循环计算分页,保存得到每页的内容范围和每页的CTFrame
func createCTFrame(contentStr: String) {let range = NSMakeRange(0, contentStr.count)let att = NSMutableAttributedString(string: contentStr)att.addAttribute(.foregroundColor, value: UIColor.lightGray, range: range)att.addAttribute(.font, value: UIFont.systemFont(ofSize: 22), range: range)let framesetter = CTFramesetterCreateWithAttributedString(att as CFAttributedString)let path = CGPath(rect: self.readView.bounds, transform: nil)var pageStart = 0var frameArray: [CTFrame] = []var i: Int = 0repeat {let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(pageStart, 0), path, nil)let pageRange = CTFrameGetVisibleStringRange(frame)let beginIndex = contentStr.index(contentStr.startIndex, offsetBy: pageRange.location)let endIndex = contentStr.index(beginIndex, offsetBy: pageRange.length)let onePage = String(contentStr[beginIndex..<endIndex])pageStart = pageRange.location + pageRange.lengthprint("第\(i)页" ,pageRange, onePage)i+=1frameArray.append(frame)} while(pageStart < contentStr.count )self.frameArray = frameArray}
渲染的核心方法,在继承UIView的子类中,重写drawrect方法,里面最重要的一行就是CTFrameDraw(frame, ctx),即可完成渲染:
/// 绘制
override func draw(_ rect: CGRect) {guard let frame = frameRef, let ctx = UIGraphicsGetCurrentContext() else {return}ctx.textMatrix = CGAffineTransform.identityctx.translateBy(x: 0, y: bounds.size.height)ctx.scaleBy(x: 1.0, y: -1.0)CTFrameDraw(frame, ctx)
}
比较完整的txt阅读器demo:
iOS: .txt 小说阅读器功能开发的 5 个老套路 - 掘金
套路继续, .txt 小说阅读器功能开发 - 掘金
最简版demo: 使用coretext计算分页并渲染,上面demo的功能多,导致核心逻辑淹没在业务代码中,找起来麻烦,所以做了一个只展示核心原理的最简demo : 使用coretext渲染,解析txt文件功能
博客园系列文章:
https://www.cnblogs.com/summer-blog/p/6030641.html
https://www.cnblogs.com/summer-blog/p/6030885.html
https://www.cnblogs.com/summer-blog/p/6044118.html
https://www.cnblogs.com/summer-blog/p/6402664.html
比较精细的阅读器思路,页面行高重排,目前我们还用不到
我在七猫做阅读器——排版篇
从基础的各种CoreText渲染,到页面之间切换动画都有独立的demo,最后有一个把CoreText渲染+页面切换集成在一起的demo
小说阅读器的设计和实现 - 简书
GitHub - loyinglin/LearnCoreText
这篇关于iOS使用CoreText完成txt阅读器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!