Обновить позицию прокрутки UITextView на iPhone

Я хотел бы сделать некоторый тип обновления UITextView, чтобы вернуть текст в исходное состояние. У меня есть абзац, который динамически заполняется, в зависимости от того, на который нажимает пользователь TableViewCell. Поэтому, когда они прокручивают текстовое поле, вернитесь назад и выберите другую ячейку и верните ее, текст изменится, но позиция прокрутки останется, когда пользователь оставил ее. Как я могу вернуть его в состояние по умолчанию. Спасибо!

Ответ 1

По умолчанию, вы имеете в виду прокрутку вверх? Если это так, вы на правильном пути. Попробуйте

[myTextView scrollRangeToVisible:NSMakeRange(0, 0)];

Ответ 2

Я обнаружил, что если сначала очистить UITextView, а затем применить новый текст, он автоматически "прокрутит" назад.

myTextView.text = @"";
myTextView.text = theRealTextContent;

Ответ 3

Это работает, если вы хотите, чтобы он прокручивался вверх:

[theTextView scrollRangeToVisible:NSMakeRange(0, 0)];

Единственная проблема заключается в том, что это оживляет свой путь вверх. Если вы хотите, чтобы он был привязан к вершине, используйте это:

[theTextView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

Ответ 4

[textview setScrollEnabled:YES];
textview.text = yourText;
[textview setScrollEnabled:NO];

Ответ 5

Ни один из этих подходов не работал удовлетворительно для меня.

  • scrollRangeToVisible производит тонны визуальных артефактов (много прокрутки при переключении между большими строками), и на самом деле работает только в случае задержки вызова некоторое время (я использовал 0,1 секунды) после того, как содержимое было изменено, а не как следует из ответа Shaggy Frog.

  • настройка текста на @"" перед установкой нового содержимого не помогла, даже с задержкой.

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

В связи с этим я решил удалить и воссоздать UITextView каждый раз, когда меняю содержимое. Это редкое событие (основанное на человеческом взаимодействии) в моем приложении, которое не является проблемой производительности. Это был единственный способ найти "загрузить новое содержимое" в UITextView без тонких раздражающих прокручиваемых артефактов.

Мой опыт работы с OS3.2 (симулятор ipad)

Ответ 6

Мне удалось получить желаемый результат - заставляя UITextView "прокручивать" до верхней части его содержимого, когда редактирование заканчивается. Но для этого мне пришлось ОБОИХ отключить прокрутку в textViewDidEndEditing И ТАКЖЕ reset текст в том же методе.

Я снова включу прокрутку в textViewDidBeginEditing.

- (void) textViewDidEndEditing: textView;
{
   [textView setScrollEnabled: NO];
   NSString* savedText = [textView text];
   [textView setText:@""];
   [textView setText: savedText];
}

Ответ 7

Что в конечном итоге сработало для меня, что очистить текстовое содержимое, а затем установить его с нужным текстом в следующем цикле выполнения.

// clear the text view
self.textView.text = ""

// set the text on the next run loop
dispatch_async(dispatch_get_main_queue()) {
    self.textView.text = someText
}