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

Sam*_*art 95 iphone uitextview ios

好的,我遇到了一些问题UITextView.这是问题所在:

我添加了一些文字UITextView.然后用户双击以选择某些内容.然后我改变UITextView(以编程方式如上)和UITextView 滚动到页面底部的文本,其中有一个光标.

但是,这不是用户点击的地方.UITextView无论用户点击何处,它始终滚动到底部.

所以这是我的问题:UITextView每次更改文本时,如何强制滚动到顶部?我试过contentOffsetscrollRangeToVisible.都没有工作.

任何建议,将不胜感激.

Way*_* Lo 146

UITextView*note;
[note setContentOffset:CGPointZero animated:YES];
Run Code Online (Sandbox Code Playgroud)

这对我来说.

Swift版本(Xcode 9.3上带有iOS 11的Swift 4.1):

note.setContentOffset(.zero, animated: true)
Run Code Online (Sandbox Code Playgroud)

  • 在willLayoutsubviews方法中使用它.有用. (24认同)
  • 对我没有帮助. (11认同)
  • 这有效,但为什么这仍然是必要的?Apple的滚动逻辑需要改进,在大多数情况下,有太多的箍跳使得事情的行为与他们自动应该的方式相同. (5认同)
  • 在iOS 9中对我有效,但不早于`viewDidAppear()`。 (4认同)
  • 您可以通过在viewDidLayoutSubviews()中调用它来比viewDidAppear()更早地调用它 (3认同)

小智 68

如果有人在iOS 8中遇到此问题,我发现只需设置UITextView'stext属性,然后scrollRangeToVisible使用NSRangewith location:0,调用length:0,就可以了.我的文本视图不可编辑,我测试了可选择的和不可选择的(两个设置都没有影响结果).这是一个Swift示例:

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


小智 44

这是我的解决方案......

    override func viewDidLoad() {
        textView.scrollEnabled = false
        textView.text = "your text"
    }

    override func viewDidAppear(animated: Bool) {
        textView.scrollEnabled = true
    }
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这个解决方案,但至少从iOS 9 beta 5开始,它是唯一对我有用的东西.我假设大多数其他解决方案都假设您的文本视图已经可见.在我的情况下,并不总是如此,所以我必须保持滚动禁用,直到它出现. (5认同)

Rya*_*TCB 35

调用

scrollRangeToVisible(NSMakeRange(0, 0))
Run Code Online (Sandbox Code Playgroud)

可以工作,但称之为

override func viewDidAppear(animated: Bool)
Run Code Online (Sandbox Code Playgroud)

  • 我认为它只适用于viewDidAppear. (3认同)
  • 这是唯一对我有用的。谢谢。但是,如何禁用我觉得有些烦人的动画? (2认同)

Mar*_*ria 29

我在HTML中使用了attributionString,文本视图不可编辑.设置内容偏移对我来说也不起作用.这对我有用:禁用启用滚动,设置文本然后再次启用滚动

[yourTextView setScrollEnabled:NO];
yourTextView.text = yourtext;
[yourTextView setScrollEnabled:YES];
Run Code Online (Sandbox Code Playgroud)


小智 18

由于这些解决方案都不适合我,而且浪费了太多时间拼凑解决方案,这最终为我解决了这个问题.

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)
    })
}
Run Code Online (Sandbox Code Playgroud)

这非常愚蠢,这不是此控件的默认行为.

我希望这有助于其他人.

  • 这非常有帮助!我还必须添加:self.automaticallyAdjustsScrollViewInsets = NO; 到包含UITextView的视图,以使其完全工作. (2认同)

Ben*_*man 17

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

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


Cha*_*Guy 12

对于iOS 10和Swift 3,我做了:

override func viewDidLoad() {
    super.viewDidLoad()
    textview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    textView.isScrollEnabled = true
}
Run Code Online (Sandbox Code Playgroud)

为我工作,不确定你是否遇到了最新版本的Swift和iOS的问题.


小智 10

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

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0))
    })
Run Code Online (Sandbox Code Playgroud)


age*_*ios 8

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    textView.scrollEnabled = NO;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    textView.scrollEnabled = YES;
}
Run Code Online (Sandbox Code Playgroud)

  • 这成功了。顺便说一句,它教会了我一些非常重要的东西:“viewwillappear”中的“view”不仅仅指 self.view,而且显然指所有视图。不? (2认同)

小智 8

这就是我做到的

斯威夫特4:

extension UITextView {

    override open func draw(_ rect: CGRect)
    {
        super.draw(rect)
        setContentOffset(CGPoint.zero, animated: false)
    }

 }
Run Code Online (Sandbox Code Playgroud)


Ank*_*arg 8

这对我有用

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
      self.textView.scrollRangeToVisible(NSRange(location: 0, length: 0))
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我还想知道为什么我必须在主队列上显式调度,即使我在主队列上运行所有事件。但这对我有用 (2认同)

Cha*_*man 6

我不得不在viewDidLayoutSubviews内部调用以下内容(在 viewDidLoad内部调用为时过早):

    myTextView.setContentOffset(.zero, animated: true)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ger 5

尝试此操作将光标移动到文本的顶部.

NSRange r  = {0,0};
[yourTextView setSelectedRange:r];
Run Code Online (Sandbox Code Playgroud)

看看情况如何.确保在所有事件都被触发后或者您正在做的事情完成之后调用此函数.

  • 它不会滚动到顶部(较少的几个像素). (2认同)

Pat*_*cia 5

[txtView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];
Run Code Online (Sandbox Code Playgroud)

这行代码适合我.


小智 5

结合之前的答案,现在应该可以了:

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
Run Code Online (Sandbox Code Playgroud)


Aec*_*Liu 5

我的问题是在视图出现时将textView设置为滚动到顶部.适用于iOS 10.3.2和Swift 3.

解决方案1:

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)
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

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


小智 5

只是你可以使用这个代码

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
Run Code Online (Sandbox Code Playgroud)