使用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 – 核心文本:获取文本边界的最简单准确方法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)