UITextView начинается в нижней или средней части текста


я перейду прямо к нему. У меня есть UItextView на мой взгляд, когда нужно прокрутить, чтобы увидеть весь текст (когда в textView присутствует много текста), textView иногда начинается в середине текста, а в нижней части текста-в других случаях.

редактирование не включено в textView. Мне нужен способ, чтобы заставить виджет TextView, чтобы начать в верхней, каждый раз. Я видел некоторые вопросы вроде этого, где другие люди использовали контент смещение, но я действительно не знаю, как это работает или если бы это было применимо здесь.

Спасибо за вашу помощь.

18 64

18 ответов:

что сделал трюк для меня!

Цель C:

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

Swift:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

Swift 2 (Альтернативное Решение)

добавьте этот метод переопределения в ваш ViewController

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

Swift 3 & 4 (редактирование синтаксиса)

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

все ответы выше не работают для меня. Однако секрет заключается в реализации вашего решения в переопределении viewDidLayoutSubviews, например:

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

HTH:)

В Swift 2

вы можете использовать это, чтобы сделать textView начать сверху:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myTextView.setContentOffset(CGPointZero, animated: false)
}

подтверждена работа в Xcode 7.2 с Swift 2

попробуйте это ниже код -

if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
     self.automaticallyAdjustsScrollViewInsets = NO;         
}

или вы также можете установить это свойство с помощью раскадровки -

выберите ViewController затем выберите инспектор атрибутов теперь не установлен Adjust Scroll View Insets.

для Swift > 2.2 у меня были проблемы с iOS 8 и iOS 9, используя вышеуказанные методы, поскольку нет единого ответа, который работает, поэтому вот что я сделал, чтобы заставить его работать для обоих.

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

    if #available(iOS 9.0, *) {
        textView.scrollEnabled = false
    }

    self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if #available(iOS 9.0, *) {
        textView.scrollEnabled = true
    }
}

обновить UINavigationBar в translucent свойство NO:

self.navigationController.navigationBar.translucent = NO;

это исправит вид из рамки под панелью навигации и строки состояния.

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

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

надеюсь, что это помогает.

С большим количеством тестирования, я нашел должен добавить ниже в viewWillLayoutSubviews () функции, чтобы убедиться, что UITextView показать с самого начала:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()            
    textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0))
}

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

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

что вам нужно сделать (или я должен сказать можете do) - это расширение UITextView следующим образом:

extension UITextView {
  func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) {
    self.text = text
    let delayInSeconds = 0.001
    let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
    dispatch_after(popTime, dispatch_get_main_queue(), {
      self.setContentOffset(storedOffset, animated: false)
      if scrollToEnd && !text.isEmpty {
        let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
        dispatch_after(popTime, dispatch_get_main_queue(), {
          self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0))
        })
      }
    })
  }
}

это обновляет текст, а затем использует сохраненное значение UITextView.contentOffset свойство (или все, что вы передаете в качестве параметра), и устанавливает смещение представления соответственно. При желании после этого он прокручивается до конца нового, потенциально измененного контента.

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

и конечно спасибо NixonsBack для размещения ответа по ссылке выше.

мой первый пост :), Ура!

Xcode 7.2 7c68; IOS 9.1

мой ViewController, которая содержит UITextView сложно, и многое изменилось во время проекта (версия IDE изменилась, возможно, 2~3 раза тоже).

Я пробовал все вышеперечисленные решения, если вы столкнулись с такой же проблемой, быть пациент.

есть три возможных "секретных кода" для решения:

  1. textView.scrollEnabled = false //then set text textView.scrollEnabled = true
  2. textView.scrollRangeToVisible(NSMakeRange(0, 0))
  3. textView.setContentOffset(CGPointZero, animated: false)

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

  1. viewDidLoad()
  2. viewDidLayoutSubviews()

объедините их, вы получите 3 * 2=6 решений, правильная комбинация зависит от того, насколько вы сложны ViewController is (поверьте мне, после удаления просто вид выше textView, мне нужно найти новую комбинацию).

и я обнаружил, что:

когда положить "секретные коды" в viewDidLayoutSubviews(), а textView.text = someStrings in viewDidLoad() содержание в textView будет "раскачивать" иногда. Итак, положите их в одно и то же место.

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

следующий код должен дать вам эффект, который вы хотите.

[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

вам нужно будет заменить " self.scrollView " с именем вашего вида прокрутки. Вы должны поместить этот код после того, как вы установили текст представления прокрутки.

положить эту строку кода в ViewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

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

 override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false)

}

это работает для меня с Xcode 8.3.3:

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)];
}

Я перевел ответ zeeple на MonoTouch / Xamarin (C#).

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();
    myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false);
}

создайте розетку для вашего UITextView на . В пишем следующее:

Swift:

self.textView.contentOffset.y = 0

Я пробовал:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

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

От Хуана Давида Круса Серрано:

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

и от Мурата Ясара:

automaticallyAdjustsScrollViewInsets = false

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

заставить textView чтобы каждый раз начинать сверху, используйте следующий код:

Swift 4.2:

override func viewDidLayoutSubviews() {
    textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}

Objective-C:

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

в моем случае я загружал textView в пользовательскую ячейку tableview. Ниже приведено то, что я сделал, чтобы убедиться, что текст в textview загружается в верхней части текста в моем textview в моей пользовательской ячейке.

1.) в раскадровке установите textview ScrollEnabled = false, сняв флажок с кнопки.

2.) вы устанавливаете isScrollEnabled в true на textview после загрузки представления. Я установил свой в небольшой задержке, как ниже:

override func awakeFromNib() {
    super.awakeFromNib()

let when = DispatchTime.now() + 1
      DispatchQueue.main.asyncAfter(deadline: when){
        self.textView.isScrollEnabled = true
     }

}

независимо от того, если вы находитесь в моей ситуации или нет, попробуйте установить scrollEnabled в false, а затем, когда представление загружается, установите scrollEnabled в true.