gpt4 book ai didi

ios - 使用 NSLayoutManager 计算文本大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:56 30 4
gpt4 key购买 nike

我正在开发一个 View ,它使用 TextKit 框架在列中排版文本,如下所示: Column Text Layout

我使用带有边缘插入(黑色矩形)的 UIView 边界来计算 10 个 CGRects,然后我将其转换为 NSTextContainers(红色矩形)。在 drawRect: 中,我将它们传递给 NSLayoutManager,后者为我排版和绘制字形。

我的问题是:我如何计算所需的列数?我可以绘制固定数量的列,但对于不同的文本长度,我需要以编程方式调整列数。 p>

我找到了方法 [NSLayoutManager glyphRangeForTextContainer:] 当文本容器留空时它返回长度范围 0。因此,我可以循环创建文本容器并使用此方法来确定是否需要更多容器。但是,据说这种方法效率低下,因为它会触发布局计算,而且我不喜欢在一个循环中运行它可能超过数百次。

必须有更好的方法!

谢谢你的回答,皮特。

最佳答案

好吧,在深入研究 TextKit 框架之后,我终于找到了答案。

我的代码在这样的循环中工作:

while ([self needsMoreColumns]) {
[self addColumn];
}

...

- (BOOL)needsMoreColumns {
// Always create at least one column
if (self.layoutManager.textContainers.count == 0)
return YES;

// Find out the glyph range of the last column
NSRange range = [self.layoutManager glyphRangeForTextContainer:[self.layoutManager.textContainers lastObject]];
NSUInteger glyphs = [self.layoutManager numberOfGlyphs];

// Compare it with the number of glyphs
return range.location + range.length < glyphs;
}

我没有包括 [self addColumn] 方法,因为它很简单。它只是使用我的布局的几何形状和最后一列的位置(如果有的话)来计算下一列的 CGRect。然后,它创建具有相应大小的 NSTextContainer 并将矩形的 origin 属性存储在专用数组中以用于绘制目的。

我还发现了方法 [NSLayoutManager firstUnlaidCharacterIndex][NSLayoutManager firstUnlaidGlyphIndex] 但它们似乎没有按预期工作。在仅在一列中布置三列文​​本后,他们返回整个字符串的长度,而不是不适合第一列的第一个字符的位置。这就是为什么我宁愿使用基于范围的方法。

就这些了,大家注意安全!皮特。

关于ios - 使用 NSLayoutManager 计算文本大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25546643/

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