Ios UITextView从文本的底部或中间开始
我马上就去。我有一个<代码> UITExtVIEW/CODE >,在我看来,当需要滚动查看所有文本时(文本视图中存在大量文本),TeTVIEW有时会在文本的中间和文本的底部开始。p> 文本视图上未启用编辑功能。我需要一种方法来强制文本视图每次都从顶部开始。我看到一些类似这样的问题,其他人使用了内容偏移,但我真的不知道它是如何工作的,或者它是否适用于这里Ios UITextView从文本的底部或中间开始,ios,objective-c,swift,xcode,cocoa-touch,Ios,Objective C,Swift,Xcode,Cocoa Touch,我马上就去。我有一个 UITExtVIEW/CODE >,在我看来,当需要滚动查看所有文本时(文本视图中存在大量文本),TeTVIEW有时会在文本的中间和文本的底部开始。p> 文本视图上未启用编辑功能。我需要一种方法来强制文本视图每次都从顶部开始。我看到一些类似这样的问题,其他人使用了内容偏移,但我真的不知道它是如何工作的,或者它是否适用于这里 感谢您的帮助。以下代码将为您提供所需的效果 [self.scrollView setContentOffset:CGPointMake(0, -sel
感谢您的帮助。以下代码将为您提供所需的效果
[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
您需要将“self.scrollView”替换为滚动视图的名称。您应该在设置滚动视图的文本后输入此代码。将UINavigationBar的
半透明属性更新为否
:
self.navigationController.navigationBar.translucent = NO;
这将修复视图在导航栏和状态栏下方的边框
如果必须显示和隐藏导航栏,请在viewDidLoad
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
希望这对我有帮助。这帮了我的忙
目标C:
斯威夫特:
Swift 2(替代解决方案)
将此覆盖方法添加到ViewController
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPointZero, animated: false)
}
Swift 3和4(语法编辑)
试试下面的代码-
if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
self.automaticallyAdjustsScrollViewInsets = NO;
}
也可以通过情节提要设置此属性-
选择ViewController,然后选择属性检查器现在未选中调整滚动视图插入UITextView
滚动对许多人来说似乎是个问题。从这里收集的答案(尤其是)和苹果开发者文档,运用我自己的一些智慧,这里有一个适合我的解决方案。您可以修改代码以满足您的需要
我的用例如下:相同的UITextView
用于不同的目的,在不同的情况下显示不同的内容。我想要的是,当内容更改时,旧的滚动位置会恢复,或者有时会滚动到最后。我不想太多的动画时,这是完成。特别是我不希望视图像所有的文本都是新的一样进行动画处理。此解决方案首先恢复没有动画的旧滚动位置,然后根据需要滚动到动画结束
您需要做(或者我应该说可以做)的是如下扩展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
属性的存储值(或作为参数传递的任何内容),并相应地设置视图的偏移量。如果需要,在此之后,它将滚动到新的、可能更改的内容的末尾
我是iOS编程新手,我不知道为什么它工作得这么好,如果有人知道这方面的一些信息,我会很高兴知道。此外,这种方法可能并不完美,因此我也愿意接受改进意见
当然,感谢你在上面的链接后面发布了答案
我的第一篇帖子:),干杯 经过大量测试,我发现必须在viewWillLayoutSubviews()函数中添加以下内容,以确保UITextView从一开始就显示出来:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0))
}
在ViewController.swift
文件中为您的UITextView
创建一个插座。在ViewDidLoad
部分中,输入以下内容:
斯威夫特:
self.textView.contentOffset.y = 0
我试过:
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
以上所有答案对我来说都不适用。但是,秘密在于在viewDidLayoutSubviews的覆盖范围内实现您的解决方案,如下所示:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
welcomeText.contentOffset = .zero
}
HTH:)这对我很有效:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false)
}
Xcode 7.2 7c68;IOS 9.1
我的ViewController
包含UITextView
的内容非常复杂,并且在项目期间更改了很多(IDE版本也可能更改了2~3次)
我已经尝试了以上所有解决方案,如果遇到相同的问题,请耐心等待
有三种可能的“密码”需要解决:
textView.scrollEnabled=false
//然后设置文本
textView.scrollEnabled=true
textView.scrollRangeToVisible(NSMakeRange(0,0))
textView.setContentOffset(CGPointZero,动画:false)
您可以在两个地方输入这些代码:
viewDidLoad()
viewdilayoutsubviews()
将它们组合起来,您将得到3*2=6个解决方案,正确的组合取决于ViewController
的复杂程度(相信我,在删除textView
上方的一个视图后,我需要找到一个新的组合)
我发现:
在viewdilayoutsubviews()
中放入“密码”,但在viewdiload()
中放入textView.text=someStrings
时,textView
中的内容有时会“抖动”。所以,把它们放在同一个地方
最后一句话:尝试所有组合,这就是我在两个月内解决这个愚蠢错误三次以上的方法。在Swift 2中
您可以使用此选项使textView从顶部开始:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myTextView.setContentOffset(CGPointZero, animated: false)
}
确认在Xcode 7.2中使用Swift 2工作对于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
}
}
将这一行代码放入ViewDidLoad
我把zeeple的答案翻译成MonoTouch/Xamarin(C)
在我的例子中,我在自定义tableview单元格中加载textView。下面是我为确保文本视图中的文本加载在自定义单元格中文本视图中文本的顶部所做的操作
1。)在情节提要中,取消选中按钮,将textview ScrollEnabled设置为false
2。)加载视图后,在textview上将IsScrolEnabled设置为true。我在一个小延迟中设置了我的,如下所示:
override func awakeFromNib() {
super.awakeFromNib()
let when = DispatchTime.now() + 1
DispatchQueue.main.asyncAfter(deadline: when){
self.textView.isScrollEnabled = true
}
}
不管怎样,如果您是否处于我的情况,请尝试将scrollEnabled设置为false,然后在加载视图时设置
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myTextView.setContentOffset(CGPointZero, animated: false)
}
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
}
}
self.automaticallyAdjustsScrollViewInsets = false
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false);
}
override func awakeFromNib() {
super.awakeFromNib()
let when = DispatchTime.now() + 1
DispatchQueue.main.asyncAfter(deadline: when){
self.textView.isScrollEnabled = true
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPoint.zero, animated: false)
}
automaticallyAdjustsScrollViewInsets = false
-(void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
[self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)];
}
override func viewDidLayoutSubviews() {
textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}
let animation = false //or whatever you want
self.mainTextView.setContentOffset(.zero, animated: animation)
self.mainTextView.attributedText = YOUR_ATTRIBUTED_TEXT
self.mainTextView.setContentOffset(.zero, animated: animation)