2015-04-09 16 views
7

Tworzę UITextView i dodaję do niego dużo tekstu. Kiedy uruchamiam widok, UITextView jest zawsze przewijany w dół. Ponieważ użytkownik może przewijać w górę, ale po prostu czuje się dziwnie.UITextView jest częściowo przewijany w dół po otwarciu widoku

Co się dzieje? Czy brakowało mi jakichś oczywistych ustawień?

Proszę odnieść się do następującego obrazu. Część tekstu jest wycięta. Pożyczam tekst od link.

enter image description here

zacząłem prosty jednym widoku aplikacji. Jest to, jak wygląda moja 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; 
} 

A to moja storyboard:

enter image description here

Jak to wygląda po ręcznie przewijać do góry.

enter image description here

+0

można przewijać do punktu że jeśli nie dotkniesz tekstu, nadal widzisz pierwszy wiersz tekstu? Pytam o to, ponieważ tekst może znajdować się za nawigatorem ... –

+0

@NicolasS Tak, mogę przewinąć z powrotem bez problemu. –

+0

Hi @NicolasS, właśnie dodałem kolejny zrzut ekranu. Dowolny pomysł? –

Odpowiedz

3

Dodaj tę linię na końcu viewDidLoad:

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

Jak to:

- (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

dzięki za cynk, ale wciąż brakuje niektórych pikseli na górze tekstu (padding) – Lope

2

miałem ten sam problem i rozwiązać go przez coraz poprzednią pozycję przewijania i resetowanie go po aktualizacji „text”

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

Ustawienie contentOffset na CGPointZero działało dla mnie, ale tylko wtedy, gdy wyeksportowałem je do asynchronicznego wywołania w głównym wątku. Jeśli wywołałem to bezpośrednio w viewDidLoad, okazało się, że nie zadziała. – Michael

3

Zdarzyło się to na wszystkich urządzeniach iPhone/iPod w trybie poziomym, a inne będą działać. Teraz dzieje się tak tylko w przypadku iPhone'a 6+ lub iPhone'a 6s + w trybie poziomym. Jest to dzieło się za nim:

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

Widok jest przewijane jakoś po viewWillAppear i przed viewDidAppear, i dlatego musimy przede wysyłkę.

1

Dla osób korzystających Xamarin, jest to jedyne rozwiązanie, które działa na mnie:

textView.Text = "very long text"; 

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

Najlepszym rozwiązaniem działa dla mnie (Objective C):

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