相关疑难解决方法(0)

如何在UILabel中找到文本子字符串的CGRect?

对于给定的NSRange,我想找到一个CGRectUILabel对应的的字形NSRange.例如,我想CGRect在"快速的棕色狐狸跳过懒狗"这句话中找到包含"狗"字样的字样.

问题的视觉描述

诀窍是,UILabel有多行,而文本确实attributedText如此,所以找到字符串的确切位置有点困难.

我想在我的UILabel子类上写的方法看起来像这样:

 - (CGRect)rectForSubstringWithRange:(NSRange)range;
Run Code Online (Sandbox Code Playgroud)

细节,对于有兴趣的人:

我的目标是能够创建一个具有UILabel的确切外观和位置的新UILabel,然后我可以制作动画.我已经把剩下的事情搞清楚了,但特别是这一步让我暂时退缩了.

到目前为止我尝试解决问题的方法是:

  • 我希望在iOS 7中,有一些Text Kit可以解决这个问题,但是我用Text Kit看到的大多数例子都集中在UITextViewUITextField而不是UILabel.
  • 我在这里看到了有关Stack Overflow的另一个问题,它承诺解决问题,但是已接受的答案已经超过两年了,并且代码在属性文本中表现不佳.

我敢打赌,对此的正确答案涉及以下其中一项:

  • 使用标准的Text Kit方法在一行代码中解决此问题.我打赌它会涉及NSLayoutManagertextContainerForGlyphAtIndex:effectiveRange
  • 编写一个复杂的方法,将UILabel分成几行,并在一行中找到一个字形的矩形,可能使用Core Text方法.我目前最好的选择是拆开@mattt优秀的TTTAttributedLabel,它有一个方法可以在一个点上找到一个字形 - 如果我将其反转,并找到一个可能有效的字形点.

更新:这是一个github要点,我已经尝试了迄今为止解决这个问题的三件事:https://gist.github.com/bryanjclark/7036101

uilabel ios ios7 textkit

69
推荐指数
4
解决办法
2万
查看次数

layoutManager boundingRectForGlyphRange:inTextContainer:不适用于所有字符串

我有一个像字符串一样的推文的UILabel,包括其他用户的提及.

Hey @stephen and @frank and @Jason1.
Run Code Online (Sandbox Code Playgroud)

我试图让每个提及都可以点击,这样我就可以加载该用户的个人资料.我从另一个SO帖子中找到了一些代码(如何找到UGRabel中文本子字符串的CGRect?),我可以使用它来查找字符串中每个提及的位置.但是,它通常不适用于帖子中的最后一个或最后两个提及.

来自SO帖子的方法(稍加修改):

- (CGRect)boundingRectForCharacterRange:(NSRange)range
{
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.myLabel.attributedText];
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    [textStorage addLayoutManager:layoutManager];
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.myLabel.bounds.size];
    textContainer.lineFragmentPadding = 0;
    [layoutManager addTextContainer:textContainer];

    NSRange glyphRange;

    // Convert the range for glyphs.
    [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];

    return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
}
Run Code Online (Sandbox Code Playgroud)

然后,在touchesEnded:,我循环每次提及,获取主字符串中的范围,并检查触摸是否在CGRect内.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{        
    UITouch *touch = touches.allObjects[0];

    for (NSString *mention in self.mentions) { …
Run Code Online (Sandbox Code Playgroud)

objective-c ios

7
推荐指数
1
解决办法
2730
查看次数

在NSTextField中查找单词的rect/position

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

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

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

macos nstextfield swift

0
推荐指数
1
解决办法
792
查看次数

标签 统计

ios ×2

ios7 ×1

macos ×1

nstextfield ×1

objective-c ×1

swift ×1

textkit ×1

uilabel ×1