it-swarm.com.ru

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

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

 enter image description here

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

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

70
Alex Wulff

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

Цель 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)
    }
158
David Cruz

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

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

HTH :)

51
zeeple

В Swift 2

Вы можете использовать это для запуска textView сверху:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myTextView.setContentOffset(CGPointZero, animated: false)
}

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

14
Nick89

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

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

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

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

12
keshav vishwkarma

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

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

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

Измените свойство translucent вашего UINavigationBar на NO:

self.navigationController.navigationBar.translucent = NO;

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

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

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

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

5
Mrunal

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 (Поверьте, после удаления только представления выше textView мне нужно найти новую комбинацию). 

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

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

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

4
outcast

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

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

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

Мой первый пост :), ура!

4
ipe

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

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

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

3
Gary Riches

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

self.automaticallyAdjustsScrollViewInsets = false
3
Murat Yasar

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

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

}
2
bpolat

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

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

Создайте выход для своего UITextView в файле ViewController.Swift. В разделе ViewDidLoad укажите следующее:

Swift:

self.textView.contentOffset.y = 0

Я пытался:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
2
J.Bury

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

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

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

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

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

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

automaticallyAdjustsScrollViewInsets = false

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

0
Leon

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