当前位置:  开发笔记 > 运维 > 正文

在NSTextField中查找单词的rect/position

如何解决《在NSTextField中查找单词的rect/position》经验,为你挑选了1个好方法。

我有一个NSTextField,里面有一个句子.我想为句子中的每个单词找到一个rect(理想情况下)或位置,以便在那些位置(NSTextField之外)执行操作.

在NSTextView/UITextView中这样做似乎是可以实现的与NSLayoutManager.boundingRectForGlyphRange,但没有NSLayoutManager是NSTextView(和UITextView的)都似乎更具挑战性的一点.

在NSTextField中找到给定单词的位置的最佳方法是什么?



1> Ken Thomases..:

它需要一个几乎没有记录的魔法和另一个完全没有记录的位.这是Objective-C代码.不要在Swift中使用它,对不起.

NSRect textBounds = [textField.cell titleRectForBounds:textField.bounds];

NSTextContainer* textContainer = [[NSTextContainer alloc] init];
NSLayoutManager* layoutManager = [[NSLayoutManager alloc] init];
NSTextStorage* textStorage = [[NSTextStorage alloc] init];
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];
textContainer.lineFragmentPadding = 2;
layoutManager.typesetterBehavior = NSTypesetterBehavior_10_2_WithCompatibility;

textContainer.containerSize = textBounds.size;
[textStorage beginEditing];
textStorage.attributedString = textField.attributedStringValue;
[textStorage endEditing];

NSUInteger count;
NSRectArray rects = [layoutManager rectArrayForCharacterRange:matchRange
                                 withinSelectedCharacterRange:matchRange
                                              inTextContainer:textContainer
                                                    rectCount:&count];
for (NSUInteger i = 0; i < count; i++)
{
    NSRect rect = NSOffsetRect(rects[i], textBounds.origin.x, textBounds.origin.y);
    rect = [textField convertRect:rect toView:self];
    // do something with rect
}

typesetterBehavior被记录在这里.这lineFragmentPadding是根据经验确定的.

根据您计划对矩形进行的确切操作,您可能希望{ NSNotFound, 0 }作为选定的字符范围传递.

为了提高效率,通常需要保留文本对象,而不是每次都实例化它们.您只需每次将文本容器containerSize和文本存储attributedString设置为适当的值.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有