UITextView начинается в нижней или средней части текста
Я получу право на это. У меня есть UItextView
размещенный в моем представлении, что, когда необходимо прокрутить, чтобы увидеть весь текст (когда в textView присутствует много текста), textView иногда начинается в середине текста, а в другом - в нижней части текста.
![enter image description here]()
Редактирование не включено в textView. Мне нужен способ заставить textView запускаться сверху, каждый раз. Я видел некоторые вопросы, примерно такие, как это, когда другие люди использовали смещение контента, но я действительно не знаю, как это работает или будет ли оно применимо здесь.
Спасибо за вашу помощь.
Ответы
Ответ 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.