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,如果遇到同样的问题,请耐心等待 。
有三个可能的“密码”来解决:
-
textView.scrollEnabled = false //then set text textView.scrollEnabled = true
-
textView.scrollRangeToVisible(NSMakeRange(0, 0))
-
textView.setContentOffset(CGPointZero, animated: false)
有两个地方你可以把这些代码:
-
viewDidLoad()
-
viewDidLayoutSubviews()
结合他们,你会得到3 * 2 = 6的解决scheme,正确的组合取决于你是多么复杂的ViewController
是(相信我,删除只是一个视图上面的textView
,我需要find一个新的组合)。
我发现:
当在viewDidLayoutSubviews()
放置“密码”,而在viewDidLayoutSubviews()
放置textView.text = someStrings
, viewDidLoad()
的内容有时会“抖动”。 所以,把它们放在同一个地方。
最后一句话:尝试所有的组合,这是我在两个月内三次以上解决这个愚蠢的错误。
下面的代码应该给你想要的效果。
[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。
- AVFoundation,如何captureStillImageAsynchronouslyFromConnectionclosures快门声音?
- 我怎样才能禁用UITableViewselect突出显示?
- 如何调整UITableView的tableHeaderView?
- 如何在iphone上完成透明的rect视图?
- 从float或double实例化NSDecimalNumber的正确方法
- 为什么unit testing内部的代码不能findbundle资源?
- 如何使用iconutil手动创buildicns文件?
- 在NSOrderedSet生成的访问器中抛出exception
- UITableViewCell与iOS 7中的UITextView高度?