ios - 核心文本( swift ):为每个字母设置框架
问题描述
归档以下效果时:
将每个中文字母转换为
NSAttributedString
将每个转换
NSAttributedString
为CTLine
所以每一个中文字母都是一个CTLine
那么关键的数学问题是计算背景图像/字母的来源
let bgGrip = UIImage(named: "x")
func drawGrips(m info: TxtRenderInfo, lnH lnHeight: CGFloat, index i: Int, dB beginIdx: Int, lineOrigin lnOrigin: CGPoint, context ctx: CGContext, lnAscent lineAscent: CGFloat) -> CGFloat{
let content = info.strArr[i - beginIdx]
let glyphCount = content.count
var frameImg = TextContentConst.bgImgFrame
let lnOffsset = (TextContentConst.padding - lnHeight) * 0.5
var lineOrigin = lnOrigin
lineOrigin.y -= lnOffsset
var textP = lineOrigin
for idx in 0..<glyphCount{
let pieX = String(content[idx])
let ln = CTLineCreateWithAttributedString(pieX.word)
let lnSize = ln.lnSize
let typeOriginX = TextContentConst.padding * CGFloat(idx + 1)
textP.x = typeOriginX + (TextContentConst.padding - lnSize.width) * 0.5
ctx.textPosition = textP
frameImg.origin.x = typeOriginX
frameImg.origin.y = lineOrigin.y + lineAscent - TextContentConst.bgImgFrame.size.height + TextContentConst.offsetP.y
// draw image
bgGrip?.draw(in: frameImg)
// draw text
CTLineDraw(ln, ctx)
}
return lnOffsset
}
extension CTLine{
var lnSize: CGSize{
var lnAscent:CGFloat = 0
var lnDescent:CGFloat = 0
var lnLeading:CGFloat = 0
let glyphW = CTLineGetTypographicBounds(self , &lnAscent, &lnDescent, &lnLeading)
let lnHeight = lnAscent + lnDescent + lnLeading
return CGSize(width: CGFloat(glyphW), height: lnHeight)
}
}
CTLine
-> CTRun
->CGGlyph
一个中文字母是一个CTLine
, 不太好听。
那么如何改进代码呢?
解决方案
推荐阅读
- django - 如何在 Django 中创建一个名为 student 的新用户模型而不修改已经存在的基本用户?
- javascript - 在用javascript制作购物车时,我被购物车中已有的功能卡住了?
- r - as.numeric(as.character(x)) 可以改变 x 吗?
- typescript - 运行时错误“TypeError:无法读取未定义的属性 'Payload'”--> 在 aws s3 selectObjectContent 和 dynamodb putItem 期间
- flutter - 咀嚼颤动无法播放来自 youtube 的视频
- javascript - react native:关闭应用程序并再次打开后,我想通过快捷方式到达某个页面的情况?
- javascript - Firebase UI 无法使用 google 登录:updateCurrentUser 失败
- php - 如何在 PHP 中反转多级数组
- javascript - 将 react chartjs 的标签文本更改为图像
- javascript - Javascript 对象方法评估函数