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

时间:2015-04-09 19:33:55

标签: ios objective-c

我创建了一个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

5 个答案:

答案 0 :(得分: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 :(得分:3)

这种情况曾经发生在横向模式下的所有iPhone / iPod设备上,而其他设备的解决方案也可以使用。现在它只适用于横向模式下的iPhone 6+或iPhone 6s +。这是一个解决它的方法:

public void add(Character a, Character b){

        if (adj.containsKey(a)){

           //get a reference to the existing linked list
           LinkedList<Character> l = adj.get(a);

           //add to the existing LinkedList
           //You need to do a null check here to make sure (l != null)
           l.add(b)
        }else{

           //create a new LinkedList and add to it.
           LinkedList<Character> l = new LinkedList<Character>();
           l.add(b);
           adj.put(a, l);
        }

    }
}

视图在- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; dispatch_async(dispatch_get_main_queue(), ^{ [self.textView scrollRangeToVisible:NSMakeRange(0, 1)]; }); } 之后和viewWillAppear之前以某种方式滚动,这就是我们需要上述发送的原因。

答案 2 :(得分:2)

我有同样的问题,我通过获取上一个滚动位置并在更新&#34;文本&#34;

后重置它来解决它
CGPoint p = [self.texField contentOffset];
self.textField.text = terms;
[self.textField setContentOffset:p animated:NO];
[self.textField scrollRangeToVisible:NSMakeRange([tv.text length], 0)];

答案 3 :(得分:1)

对于那些使用Xamarin的人来说,这是唯一适合我的解决方案:

textView.Text = "very long text";

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

答案 4 :(得分:0)

对我来说最好的解决方案(目标C):

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