UITextView 文本内容不是从顶部开始的

我有一个来自我的 JSON 文件的长文本,但当我点击链接从我的 UITableViewCell 到我的 UIViewController 页面,UITextView 文本加载字符串内容,但它不显示内容从开始,我必须一直向上滚动。

我需要做什么?

37493 次浏览

在加载内容之前以编程方式禁用 textview 的滚动属性 textview.scrollenabled = NO;

并在加载后启用文本视图 textview.scrollenabled = YES;的滚动

还要检查一下 XIB,不要检查 Textview 启用的滚动条。

我也遇到了同样的问题,结果是我必须在 viewDidLayoutSubviews 中设置内容偏移量才能生效。我使用这段代码来显示属性化的静态文本。

- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}

SWIFT 3:

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.textView.setContentOffset(CGPoint.zero, animated: false)
}
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];

viewDidLoad

问题 IOS10中 UITextView 顶部的空白区域的答案提供了更清晰的最终用户体验。

在包含文本视图的视图控制器的 viewDidLoad中:

 self.automaticallyAdjustsScrollViewInsets = false

在调用 viewDidLayoutSubviews()时,设置 textView.setContentOffset(CGPointMake(0,0), animated: false)和其他一些建议确实有效,但在 iPad 2或更老的设备上,当屏幕显示时,你实际上会看到文本滚动。这不是您希望最终用户看到的内容。

使用这些解决方案后,我仍然有问题。这个问题肯定与拥有透明的导航栏和选择在视图控制器上自动调整内容插入有关。如果你不关心你的文本在导航栏下滚动,那么最好关闭这些设置,将文本视图的顶部限制在导航栏的底部,而不是视图控制器的顶部。

如果像我一样,你希望它出现在你的导航栏下面,当你向下滚动; 然后解决方案,我的工作是添加这一点。

- (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];
}

这只是查找导航栏和状态栏的高度,并相应地调整内容偏移量。

请注意,这种方法的一个缺点是,当设备旋转时,您将最终滚动回顶部。

对我来说,费恩的工作方式是这样的:

    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 的第一行。

将代码添加到 viewdload

self.automaticallyAdjustsScrollViewInsets = NO;

在 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))
}

这是唯一对我有用的方法。在加载视图之前,我禁用了 UITextView的滚动,然后我再次启用它:

  override func viewWillAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = false
}


override func viewDidAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = true
}

我是这样做的,我把 textview 子类化,然后:

override func willMoveToSuperview(newSuperview: UIView?) {
self.scrollEnabled = false
}


override func layoutSubviews() {
super.layoutSubviews()
self.scrollEnabled = true
}

类似于其他一些答案,但附加的好处是,你不会导致一个滚动顶部的后续设备旋转。在 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
}

这里还有另外一种方法,对我来说总是管用的。目标 C:

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.textView setContentOffset:CGPointZero animated:NO];
}

在斯威夫特:

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
textView.setContentOffset(CGPointZero, animated: false)
}

快速版:

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

从情节串连图板中,选择将文本视图放置在其上的视图控制器。在属性检查器中,取消选中“调整滚动视图插图”。就是这样。

快速版

我们需要综合考虑以下几点:

1)设置你的电源插座

  @IBOutlet var textView: UITextView!

2)在情节串连板视图控制器关闭“调整滚动视图插入”

3)通过将下面的内容添加到视图控制器,将顶部的内容设置为零

override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
myUITextView.setContentOffset(CGPointZero, animated: false)
}

Swift 3.0

override func viewWillAppear(_ animated: Bool) {
privacyText.isScrollEnabled = false
}


override func viewDidAppear(_ animated: Bool) {
privacyText.isScrollEnabled = true
}

Swift 3,4,5解决方案:

解决问题的步骤:

  • 禁用 UITextView 滚动条
  • 设置 scrollRectToVisible
  • 启用 UITextView 滚动条

密码:

yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
yourTextView.scrollRectToVisible(rect, animated: false)
yourTextView.isScrollEnabled = true

这对我有用,希望能有帮助!

这对我来说效果最好! 我把它放在 viewDidLoad ()中。

//TextView Scroll starts from the top
myTextView.contentOffset.y = 0

将以下函数添加到视图控制器类中..。

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 里面加上滚动,这样用户会看到他往上滚动到第一行

在快速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)
}

不需要从 视图设置内容偏移量,你可以从 ViewDidLoad编写 布局来设置文本视图的正确位置,如下所示:

    self.textView.layoutIfNeeded()
self.textView.setContentOffset(CGPoint.zero, animated: false)

干杯!

把这段代码放在你的类上

override func viewDidLayoutSubviews() {
self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
}