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

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

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

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

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

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

Ответы [ 36 ]

7 голосов
/ 16 апреля 2018

Вот как я это сделал

Swift 4:

extension UITextView {

    override open func draw(_ rect: CGRect)
    {
        super.draw(rect)
        setContentOffset(CGPoint.zero, animated: false)
    }

 }
5 голосов
/ 01 февраля 2011
[txtView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];

Эта строка кода работает для меня.

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

Попробуйте переместить курсор в верхнюю часть текста.

NSRange r  = {0,0};
[yourTextView setSelectedRange:r];

Посмотрите, как это происходит. Обязательно звоните после того, как все ваши события сработали или все, что вы делаете, сделано.

5 голосов
/ 02 июня 2017

Моя проблема заключается в том, чтобы установить textView для прокрутки вверх при появлении представления. Для iOS 10.3.2 и Swift 3.

Решение 1:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // It doesn't work. Very strange.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // It works, but with an animation effection.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

Решение 2:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // It works.       
    self.textView.contentOffset = CGPoint.zero
}
4 голосов
/ 02 апреля 2015

Сложили предыдущие ответы, теперь должно работать:

talePageText.scrollEnabled = false
talePageText.textColor = UIColor.blackColor()
talePageText.font = UIFont(name: "Bradley Hand", size: 24.0)
talePageText.contentOffset = CGPointZero
talePageText.scrollRangeToVisible(NSRange(location:0, length:0))
talePageText.scrollEnabled = true
4 голосов
/ 27 февраля 2017

В Swift 3:

  • viewWillLayoutSubviews - это место для внесения изменений. viewWillAppear также должно работать, но логически layout должно выполняться в viewWillLayoutSubviews .

  • Что касается методов, то оба scrollRangeToVisible и setContentOffset будут работать. Однако setContentOffset позволяет отключать или включать анимацию.

Предположим, что UITextView названо yourUITextView . Вот код:

// Connects to the TextView in the interface builder.
@IBOutlet weak var yourUITextView: UITextView!

/// Overrides the viewWillLayoutSubviews of the super class.
override func viewWillLayoutSubviews() {

    // Ensures the super class is happy.
    super.viewWillLayoutSubviews()

    // Option 1:
    // Scrolls to a range of text, (0,0) in this very case, animated.
    yourUITextView.scrollRangeToVisible(NSRange(location: 0, length: 0))

    // Option 2:
    // Sets the offset directly, optional animation.
    yourUITextView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
4 голосов
/ 01 апреля 2016

Swift 2 Ответ:

textView.scrollEnabled = false

/* Set the content of your textView here */

textView.scrollEnabled = true

Это предотвращает прокрутку textView до конца текста после его установки.

3 голосов
/ 23 февраля 2018

просто вы можете использовать этот код

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
3 голосов
/ 10 июня 2016
-(void) viewDidAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}

- (void)viewWillAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}
  • ViewWillappear сделает это немедленно, прежде чем пользователь сможет заметить, но секция ViewDidDisappear будет анимировать его лениво.
  • [mytextView setContentOffset:CGPointZero animated:YES]; иногда НЕ работает (я не знаю почему), поэтому используйте скорее scrollrangetovisible.
3 голосов
/ 10 августа 2018

Это сработало для меня

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
      self.textView.scrollRangeToVisible(NSRange(location: 0, length: 0))
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...