Текстовое содержимое UITextView не запускается сверху

У меня длинный текст, поступающий из моего файла JSON, но когда я нажимаю ссылку из моего UITableViewCell, чтобы перейти на мою страницу UIViewController, текст UITextView загружает содержимое строки, но не показывает содержимое с самого начала, и мне нужно прокрутка вверх все время.

Что мне нужно сделать?

Ответ 1

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

- (void)viewDidLayoutSubviews {
    [self.yourTextView setContentOffset:CGPointZero animated:NO];
}

SWIFT 3:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

Ответ 2

Это единственный способ, который сработал у меня. Я отключу прокрутку UITextView перед загрузкой представления, а затем снова включу его:

  override func viewWillAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = false
    }

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

Ответ 3

[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];

in viewDidLoad

Ответ 4

По программному адресу перед загрузкой содержимого отключить свойство прокрутки textview      textview.scrollenabled = NO;

А после загрузки разрешить прокрутку текста textview.scrollenabled = YES;

Также проверьте XIB, всегда не проверяя прокрутку, включенную в Textview.

Ответ 5

Ответы на вопрос Пустое пространство в верхней части UITextView в iOS 10 обеспечивают намного более чистый пользовательский интерфейс.

В viewDidLoad контроллера вида, содержащего текстовое представление:

 self.automaticallyAdjustsScrollViewInsets = false

Настройка textView.setContentOffset(CGPointMake(0,0), animated: false), и некоторые из этих других предложений работают при вызове в viewDidLayoutSubviews(), но на более старых устройствах, таких как iPad 2 и старше, вы действительно увидите, что текст будет прокручиваться при отображении экрана. Это не то, что вы хотите видеть конечным пользователем.

Ответ 6

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

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height;

    [self.textView setContentOffset:CGPointMake(0, -offset) animated:NO];
}

Это просто ищет высоту панели навигации и строки состояния и соответственно корректирует смещение содержимого.

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

Ответ 7

Для меня отлично работает этот код:

    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64 //or = 0 if no Navigation Bar
    textView.scrollEnabled = false
    textView.layoutIfNeeded()
    textView.scrollEnabled = true

Для прокрутки до точной позиции и отображения ее поверх экрана я использую этот код:

    var scrollToLocation = 50 //<needed position>
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))

Настройка contentOffset.y прокручивается до конца текста, а затем scrollRangeToVisible прокручивается до значения scrollToLocation. Таким образом, необходимая позиция отображается в первой строке scrollView.

Ответ 8

Как и некоторые другие ответы, но с дополнительным преимуществом, что вы не будете вызывать прокрутку вверх при последующих поворотах устройства. Хорошо работает в Swift 2.2

/// Whether view has laid out subviews at least once before.
var viewDidLayoutSubviewsAtLeastOnce = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if !viewDidLayoutSubviewsAtLeastOnce {
        textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false)
    }

    viewDidLayoutSubviewsAtLeastOnce = true
}

Ответ 9

Быстрая версия

Вам понадобится сочетание вещей:

1.) Установите свою розетку

  @IBOutlet var textView: UITextView!

2.) В раскадровке на контроллере просмотра отключите "Настроить вставки прокрутки"

3.) Установите контент в нуль сверху, добавив ниже к контроллеру представления.

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews()
     myUITextView.setContentOffset(CGPointZero, animated: false)
}

Ответ 10

В Swift 2, решение Xcode 7, чтобы оставить прокрутку Включено, а также начать текст сверху, это все, что вам нужно:

@IBOutlet weak var myUITextView: UITextView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //start scroll at top of text
    myUITextView.scrollRangeToVisible(NSMakeRange(0, 0))
}

Ответ 11

Swift 3.0

override func viewWillAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = false
}

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

Ответ 12

Здесь другой способ сделать это, который всегда работает для меня. Objective-C:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.textView setContentOffset:CGPointZero animated:NO];
}

И в Swift:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    textView.setContentOffset(CGPointZero, animated: false)
}

Ответ 13

Быстрая версия:

override func viewDidLayoutSubviews() {
    yourTextView.setContentOffset(CGPointZero, animated: false)
}

Ответ 14

Шаги по разрешению

  • Отключить просмотр прокрутки UITextView
  • установить scrollRectToVisible Enable
  • Прокрутка UITextView

Swift 3:

self.yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
self.yourTextView.scrollRectToVisible(rect, animated: false)
self.yourTextView.isScrollEnabled = true

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

Ответ 15

Это работало лучше для меня! Я поместил это в viewDidLoad().

//TextView Scroll starts from the top
myTextView.contentOffset.y = 0

Ответ 16

Вот как я это сделал. Я подклассифицировал textview и:

override func willMoveToSuperview(newSuperview: UIView?) {
    self.scrollEnabled = false
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.scrollEnabled = true
}

Ответ 17

Из раскадровки выберите контроллер вида, на котором у вас есть текстовое представление. В инспекторе атрибутов снимите флажок "Настроить прокрутки". Что это.

Ответ 18

добавьте следующую функцию в класс контроллера вида...

Swift 3

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(.zero, animated: false)
}
Swift 2.1

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Objective C

- (void)viewDidLayoutSubviews {
    [self.mainTextView setContentOffset:CGPointZero animated:NO];
}

或者 你 在 ViewDidAppear 里面 加上 滚动, 这样 用户 会 看到 他 往上 滚动 到 第一 行

Ответ 19

в swift 4 с приписанным текстом любой ответ не помогает мне, и я совмещаю некоторые ответы в теме.

override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
     uiTextview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
     uiTextview.isScrollEnabled = true
     uiTextview.setContentOffset(CGPoint.zero, animated: false)
}

Ответ 20

Вместо установки смещения содержимого из viewDidLayoutSubviews вы можете написать layoutIfNeeded из viewDidLoad, чтобы установить правильную позицию текстового представления, как показано ниже:

    self.textView.layoutIfNeeded()
    self.textView.setContentOffset(CGPoint.zero, animated: false)

Приветствия!!

Ответ 21

Добавить код в viewdidload

self.automaticallyAdjustsScrollViewInsets = NO;