在UITextField中的索引处查找单词的bounding rect

时间:2014-07-02 17:21:15

标签: ios objective-c cocoa-touch textkit

我有一个带有一些单词的UITextField,我想在某个索引处找出单词的边界矩形。

最好给出一些视觉示例,这样我就做了一个草图来展示我想要的东西。

让我们说我想要"很好的" (相对)到UITextField / UILabel所以我会调用一些像

这样的方法

[self boundingRectForWordAtIndex:2]

它会给我你在图片中看到的矩形

The Demo Picture

1 个答案:

答案 0 :(得分:0)

我通过使用以下代码弄明白了 受到帖子的启发:How do I get word wrap information with the new iOS 7 APIs?

- (void)focusOnWordAtIndex:(int)index {
    NSAttributedString *s = [[NSAttributedString alloc] initWithString:self.textField.text
                                                            attributes:@{NSFontAttributeName:self.textField.font}];

    NSTextContainer* tc = [[NSTextContainer alloc] initWithSize:CGSizeMake(CGFLOAT_MAX, self.frame.size.height)];
    tc.lineFragmentPadding = 0.0;
    NSLayoutManager* lm = [NSLayoutManager new];
    NSTextStorage* tm = [[NSTextStorage alloc] initWithAttributedString:s];
    [tm addLayoutManager:lm];
    [lm addTextContainer:tc];
    CGRect wordRect = [lm boundingRectForGlyphRange:[self rangeForWordAtIndex:index] inTextContainer:tc];

// Other code to focus....
}


- (NSRange)rangeForWordAtIndex:(int)index {

    __block NSRange result;
    __block int i = 0;
    NSString *text = self.textField.text;
    [text enumerateSubstringsInRange:NSMakeRange(0, text.length)
                             options:NSStringEnumerationByWords
                          usingBlock:^(NSString *substring,
                                       NSRange substringRange,
                                       NSRange enclosingRange,
                                       BOOL *stop)
    {
        if (i >= index) {
            result = substringRange;
            *stop = YES;
        }
        i++;
    }];

    return result;
}