我正在 iOS 上将多行字符串分解为单词边界。我的解决方案以 NSLayoutManager 的boundingRectForGlyphRange 方法为中心。它几乎可以工作,只是每个单词的矩形向右偏移了几个像素。换句话说, NSLayoutManager 似乎在每行上添加前导空格/缩进,我找不到任何方法来覆盖此行为。
我尝试使用 NSLayoutManager.usesFontLeading 以及 NSParagraphStyle.headIndent 但没有任何结果:
NSLayoutManager* layout = [NSLayoutManager new];
layout.usesFontLeading = NO;
NSMutableParagraphStyle* paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.headIndent = paragraphStyle.firstLineHeadIndent = 0;
NSTextStorage* textStorage = [[NSTextStorage alloc] initWithString:self attributes:@{NSFontAttributeName:font, NSParagraphStyleAttributeName:paragraphStyle}];
layout.textStorage = textStorage;
NSTextContainer* textContainer = [[NSTextContainer alloc] initWithSize:size];
[layout addTextContainer:textContainer];
// compute bounding rect for each word range
for (NSValue* wordRangeValue in wordRanges)
{
NSRange wordRange = [wordRangeValue rangeValue];
NSRange wordGlyphRange = [layout glyphRangeForCharacterRange:wordRange actualCharacterRange:NULL];
CGRect wordBounds = [layout boundingRectForGlyphRange:wordGlyphRange inTextContainer:textContainer];
}
屏幕截图:灰色矩形代表标签边界,红色矩形代表每个标签的文本矩形以及通过上面的 [boundingRectForGlyphRange:] 方法计算出的单词边界。请注意,计算出的单词边界存在几个像素的偏差。
我也对计算字边界的其他方法持开放态度,但boundingRectForGlyphRange对于我的目的来说似乎非常方便。
要忽略左边距,请使用:
textContainer.lineFragmentPadding = 0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)