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

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

在这里输入图像说明

在textView上不启用编辑。 我需要一种方法来强制textView每次都从顶部开始。 我看到一些类似这样的问题,其他人使用内容偏移量,但我不知道这是如何工作的,或者甚至在这里适用。 谢谢你的帮助。

那为我做了诡计!

目标C:

[self.textView scrollRangeToVisible:NSMakeRange(0, 0)]; 

迅速:

 self.textView.scrollRangeToVisible(NSMakeRange(0, 0)) 

Swift 2(备用解决scheme)

将此重写方法添加到您的ViewController

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

Swift 3&4(语法编辑)

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() textView.setContentOffset(CGPoint.zero, animated: false) } 

以上所有的答案都不适合我。 然而,秘密原来是在重写viewDidLayoutSubviews中实现您的解决scheme,如下所示:

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

HTH 🙂

在Swift 2中

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

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

确认在Swift 2中使用Xcode 7.2

试试下面的代码 –

 if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){ self.automaticallyAdjustsScrollViewInsets = NO; } 

或者你也可以通过StoryBoard设置这个属性 –

selectViewController,然后select属性检查器现在不选中Adjust Scroll View Insets

对于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 } } 

更新你的UINavigationBar的translucent属性为NO

 self.navigationController.navigationBar.translucent = NO; 

这将修复导航栏和状态栏下面的视图。

如果您必须显示并隐藏导航栏,请在viewDidLoad使用以下代码

  if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific 

希望这可以帮助。

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

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0)) } 

UITextView滚动似乎是一个问题,很多人。 从这里回答(特别是这个 )和苹果开发者文档,使用我自己的一些智慧,这里是一个解决scheme,适合我。 您可以修改代码以满足您的需求。

我的用例如下:相同的UITextView用于不同的目的,在不同的情况下显示不同的内容。 我想要的是当内容改变时,旧的滚动位置被恢复,或者有时滚动到最后。 完成后我不需要太多的animation。 特别是我不希望视图像所有文字都是新的一样animation。 这个解决scheme首先恢复旧的滚动位置没有animation,然后滚动到结束animation,如果需要的话。

你需要做什么(或者我应该说可以做的)是扩展UITextView,如下所示:

 extension UITextView { func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) { self.text = text let delayInSeconds = 0.001 let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) dispatch_after(popTime, dispatch_get_main_queue(), { self.setContentOffset(storedOffset, animated: false) if scrollToEnd && !text.isEmpty { let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) dispatch_after(popTime, dispatch_get_main_queue(), { self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0)) }) } }) } } 

它所做的是更新文本,然后使用UITextView.contentOffset属性的存储值(或任何您作为parameter passing的值),并相应地设置视图的偏移量。 如果需要,在此之后,它会滚动到新的可能更改的内容的末尾。

我是iOS编程的新手,我不知道为什么它的function如此出色,如果有人有这方面的信息,这将是很高兴知道。 此外,这种方法可能并不完美,所以我也愿意改进。

当然,要感谢NixonsBack在上面的链接后面发布答案。

我的第一篇文章:),欢呼!

Xcode 7.2 7c68; IOS 9.1

包含UITextView ViewController很复杂,在项目中改变了很多(IDE版本也改变了2〜3次)。

我已经尝试了以上所有解决scheme,如果遇到同样的问题,请耐心等待

有三个可能的“密码”来解决:

  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的解决scheme,正确的组合取决于你是多么复杂的ViewController是(相信我,删除只是一个视图上面的textView ,我需要find一个新的组合)。

我发现:

当在viewDidLayoutSubviews()放置“密码”,而在viewDidLayoutSubviews()放置textView.text = someStringsviewDidLoad()的内容有时会“抖动”。 所以,把它们放在同一个地方。

最后一句话:尝试所有的组合,这是我在两个月内三次以上解决这个愚蠢的错误。

下面的代码应该给你想要的效果。

 [self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES]; 

您需要将“self.scrollView”replace为滚动视图的名称。 在设置滚动视图的文本之后,应该将此代码放入。

把这一行代码放在ViewDidLoad中

 self.automaticallyAdjustsScrollViewInsets = false 

这对我工作:

  override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false) } 

我把zeeple的答案翻译成MonoTouch / Xamarin(C#)。

 public override void ViewDidLayoutSubviews() { base.ViewDidLayoutSubviews(); myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false); } 

这对Xcode 8.3.3适合我:

 -(void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)]; } 

ViewController.swift文件中为您的UITextView创build一个出口。 在ViewDidLoad部分放置以下内容:

迅速:

 self.textView.contentOffset.y = 0 

我努力了:

 self.textView.scrollRangeToVisible(NSMakeRange(0, 0)) 

我不得不在这里实现两个答案,让我的观点正常工作:

来自Juan David Cruz Serrano:

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() textView.setContentOffset(CGPoint.zero, animated: false) } 

从穆拉特亚萨尔:

 automaticallyAdjustsScrollViewInsets = false 

这给了一个UITextView加载与顶部的滚动,并且在滚动开始后插入不会改变。 很奇怪,这不是默认行为。

在我的情况下,我正在一个自定义tableview单元格中加载textView。 下面是我所做的,以确保textview中的文本加载在我的自定义单元格的textview文本的顶部。

1.)在故事板中,通过取消选中button来设置textview ScrollEnabled = false。

2.)在视图加载之后,您在textview上将isScrollEnabled设置为true。 我在下面的一个小小的延迟中设置我的:

 override func awakeFromNib() { super.awakeFromNib() let when = DispatchTime.now() + 1 DispatchQueue.main.asyncAfter(deadline: when){ self.textView.isScrollEnabled = true } } 

无论如何,如果你是在我的情况下,尝试设置scrollEnabled为false,然后当视图加载,设置scrollEnabled为true。