UITextView获取当前行

时间:2013-07-09 20:43:32

标签: ios uikit uitextfield uitextview uitextinput

有没有办法(疯狂的黑客欢迎)将当前行作为UITextView的字符串?这将包括自动换行等。例如,在这种情况下:

enter image description here

该方法将返回“堆栈溢出。是不是很好?我”因为这是基于游标的当前行。

它还可以根据光标的位置返回“这是我为之做的测试”或“这样做”。我尝试过使用UITextView方法和UITextInput协议。

编辑:

这是我尝试使用的代码。我需要找到字符串的原因是为了获得它的长度,所以这就是为什么你会看到基于UI的代码。

NSRange location = self.textView.selectedRange;
NSString *searchString = [self.textView.text substringWithRange:NSMakeRange(0, location)];
CGSize currentStringDimensions = [searchString sizeWithFont:self.textView.font constrainedToSize:CGSizeMake(self.textView.frame.size.width, self.textView.frame.size.height) lineBreakMode:NSLineBreakByWordWrapping];    
float numberOfRows = (currentStringDimensions.width/(self.textView.frame.size.width));
float left = (float)(numberOfRows - (int)numberOfRows) * (self.textView.frame.size.width);

然而,这不起作用。我认为它可能与包装的单词或不同大小的字符有关,但左边的值不一致或在第一行后关闭。

3 个答案:

答案 0 :(得分:2)

以下代码解决方案似乎正在运行。此代码中的“self”指的是 UITextView 的实例。

- (NSString *) getLineString:(NSRange)range
{
    NSLayoutManager *manager = self.layoutManager;

    // Convert it to a glyph range
    NSRange matchingGlyphRange = [manager glyphRangeForCharacterRange:range actualCharacterRange:NULL];

    // line fragment rect at location range
    CGRect rect = [manager lineFragmentRectForGlyphAtIndex:matchingGlyphRange.location effectiveRange:nil];

    // obtain the line range for the line fragment rect
    NSRange lineRange = [manager glyphRangeForBoundingRect:rect inTextContainer:self.textContainer];

    // extract the string out from lineRange
    return [self.text substringWithRange:lineRange];
}

// ... later
NSLog(@"line %@", [self getLineString:self.selectedRange]);

答案 1 :(得分:0)

这对我有用(自我= UITextView)

func getLineString() -> String {
    return (self.text! as NSString).substringWithRange((self.text! as NSString).lineRangeForRange(self.selectedRange))
}

答案 2 :(得分:-1)

我最终使用UITextInput的caretRect方法从左边获取偏移量。工作完美无缺。