核心文本 – CoreText.如何计算定义的字符串的边界框?

在CoreText中,很容易问:“给定的矩形有多少这个归因的字符串将适合?”
CTFrameGetVisibleStringRange(rect).length

将返回字符串中的下一个文本应该开始的位置.

我的问题是:“给定一个归因的字符串和一个宽度,我需要什么rect height来完全绑定归因的字符串?”

CoreText框架是否提供了这样的工具?

谢谢,
道格

解决方法

你需要的是 CTFramesetterSuggestFrameSizeWithConstraints(),你可以这样使用它:
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedString)); /*Create your framesetter based in you NSAttrinbutedString*/
CGFloat widthConstraint = 500; // Your width constraint,using 500 as an example
CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(
   framesetter,/* Framesetter */
   CFRangeMake(0,text.length),/* String range (entire string) */
   NULL,/* Frame attributes */
   CGSizeMake(widthConstraint,CGFLOAT_MAX),/* Constraints (CGFLOAT_MAX indicates unconstrained) */
   NULL /* Gives the range of string that fits into the constraints,doesn't matter in your situation */
);
CGFloat suggestedHeight = suggestedSize.height;

编辑

//IMPORTANT: Release the framesetter,even with ARC enabled!
CFRelease(frameSetter);

As ARC releases only Objective-C objects和CoreText处理C,很有可能在这里有一个内存泄漏.如果你的NSAttributedString很小,你做了一次,你不应该有任何不良后果.但是在一个例子中,你有一个循环可以计算出来,大概/复杂的NSAttributedStrings的高度是50个高度,你不会释放CTFramesetterRef,你可以有严重的内存泄漏.检查链接的教程,了解有关内存泄漏和仪器调试的更多信息.

所以解决这个问题的方法是添加CFRelease(frameSetter);

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...