Текстовий вміст UITextView не починається згори


79

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

Що мені потрібно зробити?


Ви пробували встановити contentOffset на (0,0)?
rdelmar

Ви можете редагувати це запитання. Під тегами ви бачите "редагувати". натисніть, щоб редагувати. Я отримав пропозицію щодо редагування, але відчуваю, що користувач повинен редагувати питання.
LanternMike

перегляньте цю сторінку та переконайтеся, що одне з цих рішень вам підходить. Більшість всього тут є там, і більше stackoverflow.com/questions/1234242/ ... Якщо у вас є запитання, конкретизуйте те, що відбувається, працює, а не працює те, що спробував.
LanternMike

Ось посилання на мою проблему: посилання
Орніло

єдине рішення, яке спрацювало для мене, - це одне з іншого посту
Андрій Бас

Відповіді:


160

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

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

SWIFT 3:

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

4
З усіх відповідей ця працює найкраще. Крім того, якщо ваш текст UITextView починається десь у напрямку до вертикальної середини текстового подання, тоді додавання наступного до viewDidLoad також виправить це: self.automaticallyAdjustsScrollViewInsets = false
Wizkid

Цікаво, що рішення offuttjillian справді спрацювало для мене, але рішення, надане вами @Wizkid і Glenn, робить для мене ще гірше на iOS 9.1. У будь-якому випадку воно працює зараз, і це мене радує ^^
Фрозн,

2
хоча це робоче рішення, на жаль, воно має великий побічний ефект - потворний видимий підйом, навіть якщо ви використовуєте viewWillLayoutSubviews: /
Хофі

Випробувавши майже 6 способів вирішення проблеми, ця відповідь спрацювала для мене лише в iOS9.x.
KoreanXcodeWorker

добре працює, навіть якщо встановити його після призначення тексту для UITextView
Hassy

46

Це єдиний спосіб, який працював у мене. Я вимикаю прокрутку UITextView перед завантаженням подання, а потім знову вмикаю :

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

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

2
найкраще рішення для мінімального видимого візуального ефекту від прокручуваного вгору
Хофі


У мене були проблеми із захаращенням під час прокрутки на iPad за допомогою цього рішення.
Інопланетяни


19

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

А після завантаження ввімкніть прокрутку текстового перегляду textview.scrollenabled = YES;

Окрім того, перевірте XIB, завжди не перевіряйте ввімкнену прокрутку Textview.


велике спасибі, але якщо у нас є цей utekxtview у колекціїview або tableview, це не буде працювати
Amr Angry

12

Відповіді на запитання Пустий простір у верхній частині UITextView в iOS 10 забезпечують набагато чистіший досвід для кінцевих користувачів.

У viewDidLoadконтролері подання, що містить текстовий вигляд:

 self.automaticallyAdjustsScrollViewInsets = false

Налаштування textView.setContentOffset(CGPointMake(0,0), animated: false)та деякі з цих інших пропозицій працюють під час виклику, viewDidLayoutSubviews()але на старих пристроях, таких як iPad 2 і старіших, ви фактично побачите, як текст прокручується, коли відображається екран. Ви не хочете, щоб побачив кінцевий користувач.


4

У мене все ще були проблеми після використання цих рішень. Безумовно, проблема пов’язана з наявністю прозорих навігаційних панелей та вибором для автоматичного регулювання вставки вмісту на контролері перегляду. Якщо вам все одно, як прокручувати текст під панеллю навігації, найкраще залишити ці налаштування та обмежити верхню частину тексту внизу панелі навігації, а не верхню частину контролера перегляду.

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

- (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];
}

Це просто шукає висоту панелі навігації та рядка стану і відповідно регулює зміщення вмісту.

Зверніть увагу, що одним з мінусів цього підходу є те, що при обертанні пристрою ви в кінцевому підсумку прокручуєте назад до початку.


Дякую - це в підсумку призвело мене до правильної ідеї :)
HannahCarney

4

Для мене прекрасно працює такий код:

    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.


4

Подібно до деяких інших відповідей, але з додатковою перевагою, яка не призведе до прокрутки до початку при наступних обертаннях пристрою. Добре працює в 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
}

Спробувавши кілька різних відповідей, ця спрацювала найкраще для мене. Відповідно до відповіді Шахрая, ви можете використовувати CGPointZero для CGPoint.
Мітч Дауні

Важливо зробити це за допомогою цього методу - viewDidLayoutSubviews. Багато відповідей змусять вас це зробити з оглядуWillAppear, але це неправильно. viewDidLayoutSubviews - це місце для цього. Дякую.
geekyaleks

3

Швидка версія

Потрібна комбінація речей:

1.) Встановіть свою торгову точку

  @IBOutlet var textView: UITextView!

2.) У раскадровці на View Controller вимкніть "Налаштування прокрутки вставки"

3.) Встановіть вміст на нуль зверху, додавши знизу до вашого контролера перегляду

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

'CGPointZero' недоступний у Свіфті
алі

3

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

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

Вітаємо !!


2

У 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))
}

1
Дякую! це мені чудово підходило із Swift 2.2. Жодне з інших рішень тут не працювало так гладко і просто.
Наталія

2

Свіфт 3.0

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

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

Вимкніть прокрутку в Storyboard! І включити в коді. перевизначити func viewDidAppear (_ анімований: Bool) {privacyText.isScrollEnabled = true}
Віталій А

2

Це найкраще для мене спрацювало! Я помістив це в viewDidLoad ().

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

1
Вираз не можна призначити.
Bhumesh Purohit

1

Ось ще один спосіб зробити це, який завжди працює для мене. Завдання-C:

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

А в Свіфті:

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

1

Swift версія:

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

1

додайте наступну функцію до класу вашого контролера перегляду ...

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 里面 加上 滚动 , 这样 用户 会 看到 他 往上 滚动 到 第一 行


не могли б ви перекласти останнє речення англійською мовою?
Жиль Гуайярде

1

в 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)
}

як щодо того, якщо uittextview знаходиться у поданні колекції або таблиці
Amr Angry

@AmrAngry я поняття не маю, я просто використовував його для перегляду тексту
hall.keskin

спасибі, я використовую tetxview.scrollRangeToVisible (NSMakeRange (0, 0))
Amr Angry

1

Свіфт 3, 4, 5 рішення:

Кроки для вирішення проблеми:

  • Вимкніть прокрутку UITextView
  • встановити scrollRectToVisible
  • увімкнути прокрутку UITextView

Код:

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

Це спрацювало для мене. Сподіваюся, це допоможе!


Дякую Мохіту за зручне просте пояснення.
Praveen Kumar Verma

0

Ось як я це зробив. Я підкласував текстовий перегляд і:

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

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

0

На розкадруванні виберіть контролер подання, на якому ви розмістили текстовий перегляд. В інспекторі атрибутів зніміть прапорець біля пункту "Налаштувати вставки прокрутки". Це воно.


0

Покладіть цей код у свій клас

override func viewDidLayoutSubviews() {
        self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
    }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.