Подтвердить что ты не робот

Получить координаты X и Y слова в UITextView

Я попросил разработчика (TwoLivesLeft, создателей Codea), как они сделали подсветку синтаксиса в своем приложении. Он ответил:

@TD2 редактор Codea реализован с использованием UITextView. выделение осуществляется путем наложения подсмотров в соответствующие позиции - обычно UILabels. Они выгружаются из пула повторного использования, аналогично тому, как работает UITableViewCells. Во время прокрутки линии требуя повторного выделения маркеров вытягивания из пула и линий, которые переместились с экрана, выгрузив их маркеры обратно в пул.

Может ли кто-нибудь объяснить, как я получу x и y определенного слова?

4b9b3361

Ответ 1

UITextView соответствует UITextInput, подробное описание которого можно найти здесь.

Взгляните на необходимые методы: textRangeFromPosition: toPosition: ", positionFromPosition: offset:", positionFromPosition: inDirection: offset: "и некоторые другие геометрические методы в UITextInput Protocol. Это может обеспечить функциональность, которую вы ищете.

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

Сообщите мне, если вам нужна дополнительная помощь!


UPDATE:

Вот пример кода, как это сделать. В результате я получил метод firstRectForRange:. Этот код в основном принимает последние три буквы UITextView "textStuff" и выделяет его зеленым цветом.

UITextView *textStuff = [[UITextView alloc] init];
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0);
textStuff.text = @"how are you today?";
textStuff.textColor = [UIColor blackColor];

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil];
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3];

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2];

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ];

NSLog(@"%f, %f", result1.origin.x, result1.origin.y);

UIView *view1 = [[UIView alloc] initWithFrame:result1];
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f];
[textStuff addSubview:view1];

Результат выполнения этого кода:

enter image description here

Ответ 2

@bddicken fooobar.com/info/439179/... работает как шарм. Но проблема в том, что она не работает на iOS 7+, если текст содержит новую строку "\n". После большого поиска я нашел решение для этого.

Вы должны обеспечить компоновку textView перед вызовом firstRectForRange:

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

Предоставлено: UITextView firstRectForRange не работает, когда в миксе появляются новые строковые символы

P.S: Сначала я добавил это как комментарий к ответу @bddicken. Поскольку большинство людей не читают комментарии, я добавил это как ответ.