每次更改文本时,如何强制UITextView滚动到顶部?

好的,我在UITextView有问题。 这是问题:

我添加一些文本到UITextView 。 用户然后双击select一些东西。 然后,我更改UITextView的文本(编程方式如上), UITextView滚动到有光标的页面的底部。

但是,这不是用户点击的地方。 它始终滚动到UITextView的底部,而不pipe用户点击的位置。

所以这里是我的问题:我如何强制UITextView滚动到顶部每次我改变文字? 我已经尝试了contentOffsetscrollRangeToVisible 。 既没有工作。

任何build议,将不胜感激。

 UITextView*note; [note setContentOffset:CGPointZero animated:YES]; 

这对我来说。

如果任何人在iOS 8有这个问题,我发现只是设置UITextView's文本属性,然后调用NSRangelocation:0length:0NSRange工作。 我的文本视图是不可编辑的,我testing了可选和不可选(两个设置都不影响结果)。 这是一个Swift示例:

 myTextView.text = "Text that is long enough to scroll" myTextView.scrollRangeToVisible(NSRange(location:0, length:0)) 

这是我的解决scheme

  override func viewDidLoad() { textView.scrollEnabled = false textView.text = "your text" } override func viewDidAppear(animated: Bool) { textView.scrollEnabled = true } 

调用

 scrollRangeToVisible(NSMakeRange(0, 0)) 

工作,但呼吁

 override func viewDidAppear(animated: Bool) 

我在HTML中使用的是与文本视图不可编辑的。 设置内容偏移也不适用于我。 这对我工作:禁用滚动启用,设置文本,然后再次启用滚动

 [yourTextView setScrollEnabled:NO]; yourTextView.text = yourtext; [yourTextView setScrollEnabled:YES]; 

我不确定我是否理解你的问题,但你是否只是将视图滚动到顶部? 如果是这样你应该这样做

[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];

由于这些解决scheme都没有为我工作,我浪费了太多时间拼凑解决scheme,这终于为我解决了。

 override func viewWillAppear(animated: Bool) { dispatch_async(dispatch_get_main_queue(), { let desiredOffset = CGPoint(x: 0, y: -self.textView.contentInset.top) self.textView.setContentOffset(desiredOffset, animated: false) }) } 

这真的很愚蠢,这不是这个控制的默认行为。

我希望这可以帮助别人。

这是它在iOS 9 Release上的工作方式,因此在屏幕上显示textView之前,它将滚动到顶部

 - (void)viewDidLoad { [super viewDidLoad]; textView.scrollEnabled = NO; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; textView.scrollEnabled = YES; } 

我有一个更新的答案,将使textview正确显示,并没有用户体验滚动animation。

 override func viewWillAppear(animated: Bool) { dispatch_async(dispatch_get_main_queue(), { self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0)) }) 

试试这个将光标移动到文本的顶部。

 NSRange r = {0,0}; [yourTextView setSelectedRange:r]; 

看看那是怎么回事 确保你在所有的事件发生之后都打电话给你,或者你正在做的事情都完成了。

 [txtView setContentOffset:CGPointMake(0.0, 0.0) animated:YES]; 

这行代码适合我。

对于iOS 10和Swift 3我做了:

 override func viewDidLoad() { super.viewDidLoad() textview.isScrollEnabled = false } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) textView.isScrollEnabled = true } 

为我工作,不知道你是否有最新版本的Swift和iOS的问题。

我的问题是设置textView滚动到顶部显示视图时。 对于iOS 10.3.2和Swift 3。

解决scheme1:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // It doesn't work. Very strange. self.textView.setContentOffset(CGPoint.zero, animated: false) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // It works, but with an animation effection. self.textView.setContentOffset(CGPoint.zero, animated: false) } 

解决scheme2:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // It works. self.textView.contentOffset = CGPoint.zero } 

结合以前的答案,现在它应该工作:

 talePageText.scrollEnabled = false talePageText.textColor = UIColor.blackColor() talePageText.font = UIFont(name: "Bradley Hand", size: 24.0) talePageText.contentOffset = CGPointZero talePageText.scrollRangeToVisible(NSRange(location:0, length:0)) talePageText.scrollEnabled = true 

这对我有效。 它基于RyanTCBs的答案,但它是相同的解决scheme的Objective-C变体:

 - (void) viewWillAppear:(BOOL)animated { // For some reason the text view, which is a scroll view, did scroll to the end of the text which seems to hide the imprint etc at the beginning of the text. // On some devices it is not obvious that there is more text when the user scrolls up. // Therefore we need to scroll textView to the top. [self.textView scrollRangeToVisible:NSMakeRange(0, 0)]; } 

Swift 2答案:

 textView.scrollEnabled = false /* Set the content of your textView here */ textView.scrollEnabled = true 

这可以防止textView设置后滚动到文本的末尾。

 -(void) viewDidAppear:(BOOL)animated{ [mytextView scrollRangeToVisible:NSMakeRange(0,0)];} - (void)viewWillAppear:(BOOL)animated{ [mytextView scrollRangeToVisible:NSMakeRange(0,0)];} 
  • ViewWillappear会在用户注意到之前立即执行,但是ViewDidDisappear部分将会懒惰地animation。
  • [mytextView setContentOffset:CGPointZero animated:YES]; 有时不工作(我不知道为什么),所以使用scrollrangetovisible而不是。

问题解决了:iOS = 10.2 Swift 3 UITextView

我只是用了下面这行:

 displayText.contentOffset.y = 0 

在Swift 3:

  • viewWillLayoutSubviews是进行更改的地方。 viewWillAppear也应该工作,但逻辑上, layoutWithLayoutSubviews中应该执行布局

  • 关于方法, scrollRangeToVisiblesetContentOffset都可以工作。 但是, setContentOffset允许animationclosures或打开。

假设UITextView被命名为您的UITextView 。 代码如下:

 // Connects to the TextView in the interface builder. @IBOutlet weak var yourUITextView: UITextView! /// Overrides the viewWillLayoutSubviews of the super class. override func viewWillLayoutSubviews() { // Ensures the super class is happy. super.viewWillLayoutSubviews() // Option 1: // Scrolls to a range of text, (0,0) in this very case, animated. yourUITextView.scrollRangeToVisible(NSRange(location: 0, length: 0)) // Option 2: // Sets the offset directly, optional animation. yourUITextView.setContentOffset(CGPoint(x: 0, y: 0), animated: false) } 
 [self.textView scrollRectToVisible:CGRectMake(0, 0, 320, self.textView.frame.size.height) animated:NO]; 
 -(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; [textview setContentOffset:CGPointZero animated:NO]; } 

对我来说很好用这个代码:

  textView.attributedText = newText //or textView.text = ... //this part of code scrolls to top textView.contentOffset.y = -64 textView.scrollEnabled = false textView.layoutIfNeeded() //if don't work, try to delete this line 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的第一行。

对于我在iOS 9中,它停止工作,与方法scrollRangeToVisible属性的string(1行是粗体字体,其他行是常规字体)

所以我不得不使用:

 textViewMain.attributedText = attributedString textViewMain.scrollRangeToVisible(NSRange(location:0, length:0)) delay(0.0, closure: { self.textViewMain.scrollRectToVisible(CGRectMake(0, 0, 10, 10), animated: false) }) 

其中延迟是:

 func delay(delay:Double, closure:()->Void) { dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)) ), dispatch_get_main_queue(), closure) } 

尝试使用这2行解决scheme:

 view.layoutIfNeeded() textView.contentOffset = CGPointMake(textView.contentInset.left, textView.contentInset.top) 

我有问题,但在我的情况下,textview是一些自定义视图的子视图,并将其添加到ViewController。 没有解决scheme为我工作。 为了解决这个问题,延迟0.1秒,然后启用滚动。 它为我工作。

 textView.isScrollEnabled = false .. textView.text = // set your text here let dispatchTime = DispatchTime.now() + 0.1 DispatchQueue.main.asyncAfter(deadline: dispatchTime) { self.textView.isScrollEnabled = true } 

这是我的代码。 它工作正常。

 class MyViewController: ... { private offsetY: CGFloat = 0 @IBOutlet weak var textView: UITextView! ... override viewWillAppear(...) { ... offsetY = self.textView.contentOffset.y ... } ... func refreshView() { let offSetY = textView.contentOffset.y self.textView.setContentOffset(CGPoint(x:0, y:0), animated: true) DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [unowned self] in self.textView.setContentOffset(CGPoint(x:0, y:self.offSetY), animated: true) self.textView.setNeedsDisplay() } } 

Swift 3早期版本的drew_s答案,这是我尝试了大多数其他答案后唯一的工作。

  override func viewWillAppear(_ animated: Bool) { DispatchQueue.main.async{ let desiredOffset = CGPoint(x: 0, y: -self.person_description.contentInset.top) self.person_description.setContentOffset(desiredOffset, animated: false) } } 

这是一个工作代码的剪切和粘贴。 用你的textviewvariablesreplaceperson_description。

解决scheme的Xcode 8.0。 Swift 2.3。 适用于接口构build,可以轻松修改以编程方式工作。

 class MBTextView: UITextView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setupView() } func setupView() {} } class MBStartFromTopTV: MBTextView { override func setupView() { // some custom code } override func drawRect(rect: CGRect) { super.drawRect(rect) setContentOffset(CGPoint.zero, animated: false) } }