UITextView начинается в нижней или средней части текста
я перейду прямо к нему. У меня есть UItextView
на мой взгляд, когда нужно прокрутить, чтобы увидеть весь текст (когда в textView присутствует много текста), textView иногда начинается в середине текста, а в нижней части текста-в других случаях.
редактирование не включено в textView. Мне нужен способ, чтобы заставить виджет TextView, чтобы начать в верхней, каждый раз. Я видел некоторые вопросы вроде этого, где другие люди использовали контент смещение, но я действительно не знаю, как это работает или если бы это было применимо здесь.
Спасибо за вашу помощь.
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 раза тоже).Я пробовал все вышеперечисленные решения, если вы столкнулись с такой же проблемой, быть пациент.
есть три возможных "секретных кода" для решения:
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
is (поверьте мне, после удаления просто вид вышеtextView
, мне нужно найти новую комбинацию).и я обнаружил, что:
когда положить "секретные коды" в
viewDidLayoutSubviews()
, аtextView.text = someStrings
inviewDidLoad()
содержание вtextView
будет "раскачивать" иногда. Итак, положите их в одно и то же место.последнее слово: попробуй все комбинации, вот как я решаю эту глупую ошибку более трех раз в течение двух месяцев.
следующий код должен дать вам эффект, который вы хотите.
[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
вам нужно будет заменить " self.scrollView " с именем вашего вида прокрутки. Вы должны поместить этот код после того, как вы установили текст представления прокрутки.
это сработало для меня:
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.