Подтвердить что ты не робот

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

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

enter image description here

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

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

4b9b3361

Ответ 1

Это помогло мне!

Цель 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.contentOffset = .zero
}

Ответ 2

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

override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews()

  welcomeText.contentOffset = .zero
}

HTH :)

Ответ 3

В Swift 2

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myTextView.setContentOffset(CGPointZero, animated: false)
}

Подтверждена работа в Xcode 7.2 с помощью Swift 2

Ответ 4

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

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

Или вы также можете установить это свойство в StoryBoard -

Выберите "ViewController", затем выберите "Инспектор атрибутов" теперь не отмечен Adjust Scroll View Insets.

Ответ 5

Для 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
    }
}

Ответ 6

Обновите свой ресурс UINavigationBar translucent до NO:

self.navigationController.navigationBar.translucent = NO;

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

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

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

Надеюсь, что это поможет.

Ответ 7

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

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

Ответ 8

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

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

Что вам нужно сделать (или, может быть, я могу сказать), это расширить 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 за отправку ответа по ссылке выше.

Мой первый пост:), приветствия!

Ответ 9

Xcode 7.2 7c68; IOS 9.1

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

Я пробовал все вышеперечисленные решения, если вы столкнулись с одной и той же проблемой, ПАЦИЕНТ.

Существует три возможных "секретных кода":

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

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

  • viewDidLoad()
  • viewDidLayoutSubviews()

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

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

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

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

Ответ 10

Поместите эту одну строку кода в ViewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

Ответ 11

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

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

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

Ответ 12

Создайте розетку для UITextView в файле ViewController.swift. В разделе ViewDidLoad поставьте следующее:

Swift:

self.textView.contentOffset.y = 0

Я пробовал:

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

Ответ 13

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

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

}

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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

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

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

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

automaticallyAdjustsScrollViewInsets = false

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

Ответ 17

Чтобы заставить 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];
}

Ответ 18

Swift 4.2 и Swift 5

установить смещение содержимого как до, так и после установки текста. (на главной ветке)

let animation = false //or whatever you want
self.mainTextView.setContentOffset(.zero, animated: animation)
self.mainTextView.attributedText = YOUR_ATTRIBUTED_TEXT
self.mainTextView.setContentOffset(.zero, animated: animation)

Ответ 19

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

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

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

override func awakeFromNib() {
    super.awakeFromNib()

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

}

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