ios – 核心文本:获取文本边界的最简单准确方法?

ios – 核心文本:获取文本边界的最简单准确方法?,第1张

概述题: 使用Core Text获取给定文本行的边界最简单准确方法是什么? 问题: 我尝试了多种技术,但结果不一致. 语境: 我一直试图弄清楚如何找到现在的实际界限,一行文本. 核心文本文档最多不完整是关于帧,行和运行级别例程返回的内容,说明它们返回“实际”边界,当它们实际上不同意时(至少在帧级别上),并且不返回特定字符串的实际边界,但似乎返回的大小大于预测的字体大小. 然而,当我得到单个字形的边界 题:

使用Core Text获取给定文本行的边界的最简单准确方法是什么?

问题:

我尝试了多种技术,但结果不一致.

语境:

我一直试图弄清楚如何找到现在的实际界限,一行文本.

核心文本文档最多不完整是关于帧,行和运行级别例程返回的内容,说明它们返回“实际”边界,当它们实际上不同意时(至少在帧级别上),并且不返回特定字符串的实际边界,但似乎返回的大小大于预测的字体大小.

然而,当我得到单个字形的边界时,我确实看到了不同字符之间的差异,向我建议这是唯一准确的方法(迭代所有字形,找到它们的有效结合).

我在一个 *** 场文件中写了一些测试,我错过了一些明显的东西吗?我的最终目标(部分/大部分有效)是使用自定义CALayer获取属性字符串,并对其进行缩放以填充整个边界.然后,这可以很好地与自动布局一起使用,因为我可以根据需要创建一个可以根据我的布局进行缩放的标签.

我的游乐场代码段位于下方,请注意右栏中生成的值.

// Playground - noun: a place where people can playimport UIKitimport CoreTextimport QuartzCoreprint("start")let f = UIFont.systemFontOfSize(12)let t = NSAttributedString(string: "A",attributes: [NSFontAttributename:f])let line = CTlineCreateWithAttributedString(t)var ascent:CGfloat = 0,descent:CGfloat = 0,leading:CGfloat = 0CTlineGetTypographicBounds(line,&ascent,&descent,&leading)ascentdescentascent + descentleadinglet boundingSize = CGSizeMake(CGfloat.max,CGfloat.max)let fs = CTFramesetterCreateWithAttributedString(t)let frameSize = CTFramesetterSuggestFrameSizeWithConstraints(fs,CFRangeMake(0,t.length),nil,boundingSize,nil)frameSizelet linewidth = frameSize.wIDthlet lineHeight = frameSize.height// for each runlet runs = CTlineGetGlyphRuns(line) as [AnyObject] as! [CTRun]for (runIndex,run) in runs.enumerate() {    // get Font    let attributes = CTRunGetAttributes(run) as NSDictionary as! [String:AnyObject]    let runFont:CTFont = attributes[kCTFontAttributename as String] as! CTFont    // get glyphs for current run    let glyphCount = CTRunGetGlyphCount(run)    let range = CFRangeMake(0,glyphCount)    var glyphs = Array<CGGlyph>(count: glyphCount,repeatedValue: CGGlyph())    var positions = [CGPoint](count: glyphCount,repeatedValue: CGPointZero)    CTRunGetGlyphs(run,range,&glyphs)    CTRunGetpositions(run,&positions)    let runWIDth = CTRunGetTypographicBounds(run,&leading)    runWIDth    ascent    descent    leading    // for each glyph in run    for (glyphInRun,var glyph) in glyphs.enumerate() {        let glyphFrame = withUnsafePointer(&glyph) { pointer -> CGRect in            return CTFontGetBoundingRectsForGlyphs(runFont,.Default,pointer,1) }        glyphFrame.size    }}print("done")

谢谢!

解决方法 您正在使用CTRunGetTypographicBounds.印刷边界表示用于排版的边界,因此上升,下降和前进基于字体度量,而不是基于运行中字形的实际外观.

听起来你想要CTRunGetimageBounds,它返回一个“紧紧包围运行字形的路径”的CGRect.请注意,您可以为上下文参数传递nil(在我的测试中).

总结

以上是内存溢出为你收集整理的ios – 核心文本:获取文本边界的最简单准确方法?全部内容,希望文章能够帮你解决ios – 核心文本:获取文本边界的最简单准确方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1058792.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存