UITextView从文本的底部或中间开始

Ale*_*lff 75 xcode cocoa-touch objective-c ios swift

我会正确的.我有一个UItextView放置在我的视图中,当需要滚动查看所有文本时(当textView中存在大量文本时)textView有时会在文本的中间开始,而文本的底部则会在其他时间开始.

在此输入图像描述

textView上未启用编辑.我需要一种方法来强制textView每次都从顶部开始.我看到一些问题,其他人使用内容偏移,但我真的不知道它是如何工作的,或者它是否适用于此处.

谢谢你的帮助.

Dav*_*ruz 168

这对我有用!

目标C:

[self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
Run Code Online (Sandbox Code Playgroud)

迅速:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
Run Code Online (Sandbox Code Playgroud)

Swift 2(替代解决方案)

将此覆盖方法添加到ViewController

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.setContentOffset(CGPointZero, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

Swift 3&4(语法编辑)

override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews()

  textView.contentOffset = .zero
}
Run Code Online (Sandbox Code Playgroud)

  • 效果很好!我仍然不明白为什么要这样做.为什么不自动从0,0开始? (9认同)
  • 我认为因为它意味着是一个用户输入区域,当您键入文本时,光标位于文本的末尾,如果您离开屏幕,则需要在返回时从您离开的位置继续键入. (5认同)
  • 我发现`scrollRectToVisible:CGRectMake(0,0,1,1)动画:NO`效果更好,因为它避免了由隐式动画引起的初始渲染. (2认同)

zee*_*ple 54

上面的所有答案对我都不起作用.但是,秘密最终是在viewDidLayoutSubviews的覆盖范围内实现您的解决方案,如:

override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews()

  welcomeText.contentOffset = .zero
}
Run Code Online (Sandbox Code Playgroud)

HTH :)

  • @RodrigoPedroso使用故事板,这是唯一一个对我有用的故事板 (3认同)
  • 也许是因为我正在使用笔尖,这是唯一适合我的笔尖. (2认同)

Nic*_*k89 14

在Swift 2中

您可以使用它来使textView从顶部开始:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myTextView.setContentOffset(CGPointZero, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

确认使用Swift 2在Xcode 7.2中工作


kes*_*rma 13

试试以下代码 -

if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
     self.automaticallyAdjustsScrollViewInsets = NO;         
}
Run Code Online (Sandbox Code Playgroud)

或者您也可以通过StoryBoard设置此属性 -

选择ViewController,然后选择现在未选中的属性检查器Adjust Scroll View Insets.


Cod*_*ide 8

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


Mru*_*nal 6

将您的UINavigationBar translucent属性更新为NO:

self.navigationController.navigationBar.translucent = NO;
Run Code Online (Sandbox Code Playgroud)

这将修复视图在导航栏和状态栏下面的框架.

如果您必须显示和隐藏导航栏,请使用下面的代码 viewDidLoad

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Kev*_*vin 5

通过大量测试,我发现必须在viewWillLayoutSubviews()函数中添加以下内容,以确保UITextView从一开始就显示出来:

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


out*_*ast 5

Xcode 7.2 7c68; iOS 9.1

ViewController包含的内容UITextView很复杂,并且在项目过程中进行了很多更改(IDE版本也可能更改了2〜3次)。

我已经尝试了所有上述解决方案,如果您遇到相同的问题,请耐心等待

有三种可能的“秘密代码”可以解决:

  1. textView.scrollEnabled = false //then set text textView.scrollEnabled = true
  2. textView.scrollRangeToVisible(NSMakeRange(0, 0))
  3. textView.setContentOffset(CGPointZero, animated: false)

您可以在两个地方放入这些代码:

  1. viewDidLoad()
  2. viewDidLayoutSubviews()

组合它们,您将获得3 * 2 = 6个解决方案,正确的组合取决于您的复杂ViewController程度(相信我,删除上面的视图后textView,我需要找到一个新的组合)。

我发现:

当在viewDidLayoutSubviews()中但textView.text = someStrings在中放置“秘密代码”时,中viewDidLoad()的内容textView有时会“抖动”。因此,将它们放在同一位置。

最后一句话:尝试所有组合,这就是我在两个月内解决此愚蠢错误超过三遍的方式。