UITextView получить текущую строку

Есть ли способ (сумасшедшие хаки приветствуются) получить текущую строку в виде строки UITextView? Это может включать перенос слов и т. д. Например, в этом случае:

введите здесь описание изображения

Метод вернет «переполнение стека. Разве это не здорово? I», потому что это текущая строка, основанная на курсоре.

Он также может возвращать «Это тест, для которого я сделал» или «Думаю да», в зависимости от положения курсора. Я пытался работать как с методами UITextView, так и с методами протокола UITextInput.

РЕДАКТИРОВАТЬ:

Вот код, который я пытался использовать. Причина, по которой мне нужно найти строку, состоит в том, чтобы получить ее длину, поэтому вы увидите код на основе пользовательского интерфейса.

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);

Однако это не работает. Я думаю, что это может быть связано с переносом слов или с символами разного размера, но левое значение непоследовательно или отключено после первой строки.


person roozbubu    schedule 09.07.2013    source источник
comment
Покажите код, который вы пробовали, и что он на самом деле вернул, насколько вы близки (я бы сказал, что UITextInput - правильный подход).   -  person Wain    schedule 10.07.2013
comment
Обновлю основной вопрос с ним   -  person roozbubu    schedule 10.07.2013
comment
См. это - stackoverflow.com/questions/4421267/   -  person TheTiger    schedule 16.08.2013


Ответы (3)


Похоже, что следующее кодовое решение работает. «Я» в этом коде относится к экземпляру 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]);
person Benny Khoo    schedule 25.07.2014

Это сработало для меня (я = UITextView)

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

В итоге я использовал метод caretRect UITextInput, чтобы получить смещение слева. Работал безупречно.

person roozbubu    schedule 16.08.2013
comment
@jonathanpeppers К сожалению, я не могу. Это была оплачиваемая стажировка, которую я проходил прошлым летом, поэтому код недоступен. - person roozbubu; 09.03.2014
comment
Можете ли вы повторно реализовать пример самостоятельно и опубликовать его? Похоже, в этом суть StackOverflow, это не должен быть принятый ответ, если он на самом деле не содержит ответа. - person jonathanpeppers; 10.03.2014
comment
Это было так давно, что я действительно не могу вспомнить. Я не приму этот ответ, мои извинения. - person roozbubu; 23.03.2014