打开视图时,UITextView 部分向下滚动

9
我创建了一个 UITextView 并添加了大量文本。当我启动该视图时,UITextView 总是部分滚动向下。当然用户可以向上滚动,但这感觉很奇怪。
发生了什么?我错过了任何明显的设置吗?
请参考以下图片。部分文本被剪切。我从 link 中借用了文本。

enter image description here

我开始创建了一个简单的单视图应用。这是我的 viewDidLoad 方法的样子:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString* path = [[NSBundle mainBundle] pathForResource:@"license"
                                                     ofType:@"txt"];
    NSString* terms = [NSString stringWithContentsOfFile:path
                                                encoding:NSUTF8StringEncoding
                                                   error:nil];
    self.textField.text = terms;
}

这是我的故事板:

enter image description here

这是手动滚动到顶部后的样子。

enter image description here


你能否滚动到这一点,即使你不触摸TextView,你仍然可以看到第一行文本?我问这个问题是因为TextView可能在导航栏后面... - Nicolas S
@NicolasS 是的,我可以毫无问题地向上滚动。 - Yuchen
嗨@NicolasS,我刚刚添加了另一张截图。你有什么想法吗? - Yuchen
5个回答

5
viewDidLoad方法的结尾添加以下代码行:
[self.textField scrollRangeToVisible:NSMakeRange(0, 1)];

像这样:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString* path = [[NSBundle mainBundle] pathForResource:@"license"
                                                     ofType:@"txt"];
    NSString* terms = [NSString stringWithContentsOfFile:path
                                                encoding:NSUTF8StringEncoding
                                                   error:nil];
    self.textField.text = terms;
    [self.textField scrollRangeToVisible:NSMakeRange(0, 1)];
}

1
谢谢你的提示,但是文本顶部仍然缺少几个像素(填充)。 - Lope

3

这个问题曾经在所有iPhone/iPod设备的横屏模式下发生,其他人提供的解决方案可以解决。现在只有iPhone 6+或iPhone 6s+在横屏模式下会出现这个问题。以下是解决方法:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.textView scrollRangeToVisible:NSMakeRange(0, 1)];
    });
}

viewWillAppearviewDidAppear 之间视图被滚动了,这就是为什么我们需要上面的调度。


2

我曾经遇到过同样的问题,我通过获取先前的滚动位置并在更新“文本”后进行重置来解决它。

CGPoint p = [self.texField contentOffset];
self.textField.text = terms;
[self.textField setContentOffset:p animated:NO];
[self.textField scrollRangeToVisible:NSMakeRange([tv.text length], 0)];

3
将contentOffset设置为CGPointZero对我有用,但只有在主线程上异步调用时才有效。如果我直接在viewDidLoad中调用它,我发现它不起作用。 - Michael

1
对于使用Xamarin的人来说,这是唯一对我有效的解决方案:
textView.Text = "very long text";

DispatchQueue.MainQueue.DispatchAsync(() =>
{
    textView.ContentOffset = new CGPoint(0, 0);
});

-1

对我来说最好的工作解决方案(Objective C):

- (void)viewDidLayoutSubviews {
     [self.myTextView setContentOffset:CGPointZero animated:NO];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接