8

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

在此处输入图像描述

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

它还可以根据光标的位置返回“这是我为之做的测试”或“这样想”。我尝试过使用 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);

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

4

4 回答 4

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]);
于 2014-07-25T06:37:43.597 回答
2

这对我有用(self = UITextView)

func getLineString() -> String {
    return (self.text! as NSString).substringWithRange((self.text! as NSString).lineRangeForRange(self.selectedRange))
}
于 2016-03-31T00:51:44.480 回答
0

吉尔答案的 Swift 5 扩展版本:

extension UITextView {
    func getLineString() -> String {
        guard let text = text else { return "" }
        return (text as NSString).substring(with: (text as NSString).lineRange(for: self.selectedRange))
    }
}
于 2022-02-10T08:31:12.723 回答
-1

我最终使用 UITextInput 的 caretRect 方法来获取从左侧的偏移量。完美地工作。

于 2013-08-16T20:15:41.043 回答