Как заставить UITextView прокручивать вверх каждый раз, когда я изменяю текст? - PullRequest
91 голосов
/ 05 августа 2009

ОК, у меня проблема с UITextView. Вот проблема:

Я добавляю текст к UITextView. Затем пользователь дважды щелкает, чтобы выбрать что-то. Затем я изменяю текст в UITextView (программно, как указано выше), а UITextView прокручивается вниз страницы, где находится курсор.

Однако это не то место, где пользователь нажал. Он ВСЕГДА прокручивается до нижней части UITextView независимо от того, где пользователь нажал.

Итак, вот мой вопрос: как заставить UITextView прокручивать вверх каждый раз, когда я изменяю текст? Я пробовал contentOffset и scrollRangeToVisible. Ни одна из них не работает.

Любые предложения будут оценены.

Ответы [ 36 ]

143 голосов
/ 01 апреля 2010
UITextView*note;
[note setContentOffset:CGPointZero animated:YES];

Это делает это для меня.

Swift версия (Swift 4.1 с iOS 11 на Xcode 9.3):

note.setContentOffset(.zero, animated: true)
66 голосов
/ 02 марта 2015

Если у кого-то есть эта проблема в iOS 8, я обнаружил, что просто установив текстовое свойство UITextView's, затем сработал вызов scrollRangeToVisible с NSRange с location:0, length:0. Мое текстовое представление не было редактируемым, и я тестировал как выбираемые, так и не выбираемые (ни одна из настроек не влияла на результат). Вот пример Swift:

myTextView.text = "Text that is long enough to scroll"
myTextView.scrollRangeToVisible(NSRange(location:0, length:0))
41 голосов
/ 24 июля 2015

А вот и мое решение ...

    override func viewDidLoad() {
        textView.scrollEnabled = false
        textView.text = "your text"
    }

    override func viewDidAppear(animated: Bool) {
        textView.scrollEnabled = true
    }
36 голосов
/ 13 мая 2015

Звонок

scrollRangeToVisible(NSMakeRange(0, 0))

работает, но назовите это

override func viewDidAppear(animated: Bool)
29 голосов
/ 16 октября 2014

Я использовал attribuString в HTML, текстовое представление не редактируется. Настройка смещения контента у меня тоже не сработала. Для меня это сработало: отключить прокрутку, установить текст и снова включить прокрутку

[yourTextView setScrollEnabled:NO];
yourTextView.text = yourtext;
[yourTextView setScrollEnabled:YES];
18 голосов
/ 19 января 2016

Поскольку ни одно из этих решений не помогло мне, и я потратил слишком много времени на поиск решений, это, в конце концов, решило его для меня.

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        let desiredOffset = CGPoint(x: 0, y: -self.textView.contentInset.top)
        self.textView.setContentOffset(desiredOffset, animated: false)
    })
}

Это действительно глупо, что это не поведение по умолчанию для этого элемента управления.

Надеюсь, это поможет кому-то еще.

17 голосов
/ 06 августа 2009

Я не уверен, что понимаю ваш вопрос, но вы пытаетесь просто прокрутить вид вверх? Если это так, вы должны сделать

[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];

11 голосов
/ 01 ноября 2016

Для iOS 10 и Swift 3 я сделал:

override func viewDidLoad() {
    super.viewDidLoad()
    textview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    textView.isScrollEnabled = true
}

Сработало для меня, не уверен, что у вас проблемы с последней версией Swift и iOS.

10 голосов
/ 17 октября 2015

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

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0))
    })
8 голосов
/ 21 сентября 2015

Вот как это работает на iOS 9 Release так как textView прокручивается сверху, прежде чем появится на экране

- (void)viewDidLoad
{
    [super viewDidLoad];
    textView.scrollEnabled = NO;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    textView.scrollEnabled = YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...