Текстовое содержимое UITextView не запускается сверху
У меня длинный текст, поступающий из моего файла JSON, но когда я нажимаю ссылку из моего UITableViewCell, чтобы перейти на мою страницу UIViewController, текст UITextView загружает содержимое строки, но не показывает содержимое с самого начала, и мне нужно прокрутка вверх все время.
Что мне нужно сделать?
Ответы
Ответ 1
У меня была такая же проблема, и оказалось, что мне пришлось установить смещение содержимого в viewDidLayoutSubviews, чтобы он вступил в силу. Я использую этот код для отображения атрибута статического текста.
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}
SWIFT 3:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.textView.setContentOffset(CGPoint.zero, animated: false)
}
Ответ 2
Это единственный способ, который сработал у меня. Я отключу прокрутку UITextView перед загрузкой представления, а затем снова включу его:
override func viewWillAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = true
}
Ответ 3
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];
in viewDidLoad
Ответ 4
По программному адресу перед загрузкой содержимого отключить свойство прокрутки textview textview.scrollenabled = NO;
А после загрузки разрешить прокрутку текста textview.scrollenabled = YES;
Также проверьте XIB
, всегда не проверяя прокрутку, включенную в Textview.
Ответ 5
Ответы на вопрос Пустое пространство в верхней части UITextView в iOS 10 обеспечивают намного более чистый пользовательский интерфейс.
В viewDidLoad
контроллера вида, содержащего текстовое представление:
self.automaticallyAdjustsScrollViewInsets = false
Настройка textView.setContentOffset(CGPointMake(0,0), animated: false)
, и некоторые из этих других предложений работают при вызове в viewDidLayoutSubviews()
, но на более старых устройствах, таких как iPad 2 и старше, вы действительно увидите, что текст будет прокручиваться при отображении экрана. Это не то, что вы хотите видеть конечным пользователем.
Ответ 6
У меня все еще были проблемы после использования этих решений. Проблема, безусловно, связана с наличием прозрачных навигационных полос и выбором автоматической настройки вставки содержимого на контроллере представления. Если вам не нужно прокручивать текст под панелью навигации, лучше оставить эти настройки отключенными и ограничить верхнюю часть текста в нижней части панели навигации, а не до вершины viewcontroller.
Если вы, как и я, хотите, чтобы он отображался под вашей навигационной панелью при прокрутке вниз; то решение, которое сработало для меня, было добавить это.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height;
[self.textView setContentOffset:CGPointMake(0, -offset) animated:NO];
}
Это просто ищет высоту панели навигации и строки состояния и соответственно корректирует смещение содержимого.
Обратите внимание, что одним из недостатков этого подхода является то, что когда устройство вращается, вы в конечном итоге прокручиваете назад.
Ответ 7
Для меня отлично работает этот код:
textView.attributedText = newText //or textView.text = ...
//this part of code scrolls to top
textView.contentOffset.y = -64 //or = 0 if no Navigation Bar
textView.scrollEnabled = false
textView.layoutIfNeeded()
textView.scrollEnabled = true
Для прокрутки до точной позиции и отображения ее поверх экрана я использую этот код:
var scrollToLocation = 50 //<needed position>
textView.contentOffset.y = textView.contentSize.height
textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))
Настройка contentOffset.y прокручивается до конца текста, а затем scrollRangeToVisible прокручивается до значения scrollToLocation. Таким образом, необходимая позиция отображается в первой строке scrollView.
Ответ 8
Как и некоторые другие ответы, но с дополнительным преимуществом, что вы не будете вызывать прокрутку вверх при последующих поворотах устройства. Хорошо работает в Swift 2.2
/// Whether view has laid out subviews at least once before.
var viewDidLayoutSubviewsAtLeastOnce = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if !viewDidLayoutSubviewsAtLeastOnce {
textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false)
}
viewDidLayoutSubviewsAtLeastOnce = true
}
Ответ 9
Быстрая версия
Вам понадобится сочетание вещей:
1.) Установите свою розетку
@IBOutlet var textView: UITextView!
2.) В раскадровке на контроллере просмотра отключите "Настроить вставки прокрутки"
3.) Установите контент в нуль сверху, добавив ниже к контроллеру представления.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
myUITextView.setContentOffset(CGPointZero, animated: false)
}
Ответ 10
В Swift 2, решение Xcode 7, чтобы оставить прокрутку Включено, а также начать текст сверху, это все, что вам нужно:
@IBOutlet weak var myUITextView: UITextView!
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
//start scroll at top of text
myUITextView.scrollRangeToVisible(NSMakeRange(0, 0))
}
Ответ 11
Swift 3.0
override func viewWillAppear(_ animated: Bool) {
privacyText.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
privacyText.isScrollEnabled = true
}
Ответ 12
Здесь другой способ сделать это, который всегда работает для меня. Objective-C:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.textView setContentOffset:CGPointZero animated:NO];
}
И в Swift:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
textView.setContentOffset(CGPointZero, animated: false)
}
Ответ 13
Быстрая версия:
override func viewDidLayoutSubviews() {
yourTextView.setContentOffset(CGPointZero, animated: false)
}
Ответ 14
Шаги по разрешению
- Отключить просмотр прокрутки UITextView
- установить scrollRectToVisible Enable
- Прокрутка UITextView
Swift 3:
self.yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
self.yourTextView.scrollRectToVisible(rect, animated: false)
self.yourTextView.isScrollEnabled = true
Это работало для меня.
Ответ 15
Это работало лучше для меня! Я поместил это в viewDidLoad().
//TextView Scroll starts from the top
myTextView.contentOffset.y = 0
Ответ 16
Вот как я это сделал. Я подклассифицировал textview и:
override func willMoveToSuperview(newSuperview: UIView?) {
self.scrollEnabled = false
}
override func layoutSubviews() {
super.layoutSubviews()
self.scrollEnabled = true
}
Ответ 17
Из раскадровки выберите контроллер вида, на котором у вас есть текстовое представление. В инспекторе атрибутов снимите флажок "Настроить прокрутки". Что это.
Ответ 18
добавьте следующую функцию в класс контроллера вида...
Swift 3
override func viewDidLayoutSubviews() {
self.mainTextView.setContentOffset(.zero, animated: false)
}
Swift 2.1
override func viewDidLayoutSubviews() {
self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Objective C
- (void)viewDidLayoutSubviews {
[self.mainTextView setContentOffset:CGPointZero animated:NO];
}
或者 你 在 ViewDidAppear 里面 加上 滚动, 这样 用户 会 看到 他 往上 滚动 到 第一 行
Ответ 19
в swift 4 с приписанным текстом любой ответ не помогает мне, и я совмещаю некоторые ответы в теме.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
uiTextview.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
uiTextview.isScrollEnabled = true
uiTextview.setContentOffset(CGPoint.zero, animated: false)
}
Ответ 20
Вместо установки смещения содержимого из viewDidLayoutSubviews вы можете написать layoutIfNeeded из viewDidLoad, чтобы установить правильную позицию текстового представления, как показано ниже:
self.textView.layoutIfNeeded()
self.textView.setContentOffset(CGPoint.zero, animated: false)
Приветствия!!
Ответ 21
Добавить код в viewdidload
self.automaticallyAdjustsScrollViewInsets = NO;