gpt4 book ai didi

core-text - 核心文本。如何计算属性字符串的边界框?

转载 作者:行者123 更新时间:2023-12-03 21:33:04 24 4
gpt4 key购买 nike

在 CoreText 中,很容易问:“对于给定的矩形,这个属性字符串可以容纳多少?”。

CTFrameGetVisibleStringRange(rect).length

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

我的问题是:“给定一个属性字符串和一个宽度,我需要什么矩形高度才能完全绑定(bind)属性字符串?”。

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很小,你做一次,你不应该有任何不良后果。但是如果你有一个循环来计算,比如说,50 个大/复杂的高度 NSAttributedString s,并且您不释放 CTFramesetterRef ,您可能会出现严重的内存泄漏。查看链接的教程以获取有关内存泄漏和使用仪器进行调试的更多信息。

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

关于core-text - 核心文本。如何计算属性字符串的边界框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6988498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com