有没有办法(疯狂的黑客欢迎)将当前行作为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);
然而,这不起作用。我认为它可能与包装的单词或不同大小的字符有关,但左边的值不一致或在第一行后关闭。
答案 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方法从左边获取偏移量。工作完美无缺。