我有一个应用程序,我使用 CoreText 来绘制文本突出显示。它工作得很好,除了当我尝试通过使用它来获取一行中的字符数时,CTLineGetStringRange
它通常会给我一个比实际更大的数字。例如,在包含 156 个字符的行中,范围的长度为 164。CTLineGetGlyphCount
返回相同的数字。
有人知道为什么会这样吗?我用来创建框架设置器的NSAttributedString
字体与我的UITextView
.
这是我的代码:
// Build the attributed string from our text data and string attribute data
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.text attributes:self.attributes];
// Create the Core Text framesetter using the attributed string
_framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attributedString);
// Create the Core Text frame using our current view rect bounds
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
_frame = CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), path.CGPath, NULL);
NSArray *lines = (__bridge NSArray *) CTFrameGetLines(_frame);
for (int i = 0; i < lines.count; i++) {
CTLineRef line = (__bridge CTLineRef) [lines objectAtIndex:i];
CFRange lineRange = CTLineGetStringRange(line);
NSLog(@"lineRange: %ld, %ld", lineRange.location, lineRange.length);
CFIndex glyphCount = CTLineGetGlyphCount(line);
NSLog(@"glyphCount: %ld", glyphCount);
}
我的类是一个子类,UIView
它作为子视图添加到UITextView
.
编辑: 这是我正在测试的示例字符串:
textView.text = @"Marvel's The Avengers is a 2012 American superhero film produced by Marvel Studios and distributed by Walt Disney Pictures, based on the Marvel Comics superhero team of the same name.";
在这种情况下,第一行包含
“漫威的复仇者联盟是 2012 年由漫威工作室制作并由华特迪士尼影业发行的美国超级英雄电影,基于 137 个字符长。但它给了我一个长度为 144 的线的范围。
但是,当我尝试使用以下文本时,结果有所不同:
textView.text = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
现在第一行包含
“Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim”,长度为 142。但这里它给了我正确的范围,长度为 142。
然后我尝试了更多的文本:
文字:
“阿斯加德洛基遇到了另一个被称为 Chitauri 的外星种族的领袖。作为取回 Tesseract,一种潜力未知的强大能源的交换,Other 向 Loki 许诺一支 Chitauri 军队,他可以用它征服地球。”
结果: “阿斯加德洛基遇到了另一个被称为 Chitauri 的外星种族的领袖。作为取回 Tesseract 的交换,一个强大的”长度为 145。行距
长度: 145
文本:
“斯塔克和罗杰斯意识到仅仅击败他们对洛基来说是不够的;他需要公开压制他们,以证明自己是地球的统治者。”
结果: “Stark 和 Rogers 意识到仅仅击败他们对 Loki 来说是不够的;他需要公开压制他们以证明自己是统治者”,长度为 146。行距
长度: 149
所以你可以看到有时它是正确的,有时它不是。我找不到解释。