2015-04-09 14 views
7

Creo un UITextView e aggiungo molto testo. Quando lancio la vista, lo UITextView viene sempre parzialmente spostato verso il basso. Di causa l'utente può scorrere verso l'alto, ma sembra strano.UITextView si scorre parzialmente verso il basso quando si apre la vista

Cosa succede? Ho perso qualche impostazione ovvia?

Fare riferimento all'immagine seguente. Parte del testo è tagliata. Prendo in prestito il testo da link.

enter image description here

ho iniziato una semplice vista di domanda unica. Ecco come il mio viewDidLoad assomiglia:

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

E questo è il mio storyboard:

enter image description here

Questo è come appare dopo scorrere manualmente fino alla cima.

enter image description here

+0

Puoi scorrere fino al punto che se non tocchi la textview vedi ancora la prima riga di testo? Lo chiedo perché la textview potrebbe trovarsi dietro la barra di navigazione ... –

+0

@NicolasS Sì, posso tornare indietro senza problemi. –

+0

Ciao @NicolasS, ho appena aggiunto un altro screenshot. Qualche idea? –

risposta

3

Aggiungi questa riga alla fine del vostro viewDidLoad:

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

Ti piace questa:

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

grazie per il suggerimento, ma ci sono ancora alcuni pixel mancanti nella parte superiore del testo (riempimento) – Lope

2

Ho avuto lo stesso problema e ho risolto da ottenere la posizione di scorrimento precedente e resettare dopo l'aggiornamento del "testo"

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

Impostare contentOffset su CGPointZero ha funzionato per me, ma solo quando l'ho inviato a una chiamata asincrona sul thread principale. Se l'avessi chiamato direttamente in viewDidLoad, ho scoperto che non funzionava. – Michael

3

Questo accade in tutti i dispositivi iPhone/iPod in modalità orizzontale e le soluzioni degli altri funzioneranno. Ora succede solo per iPhone 6+ o iPhone 6s + in modalità orizzontale. Si tratta di un lavoro in giro per esso:

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

La vista viene fatto scorrere in qualche modo dopo la viewWillAppear e prima viewDidAppear, ed è per questo che abbiamo bisogno l'invio sopra.

1

Per coloro che utilizzano Xamarin, questa è l'unica soluzione che funziona per me:

textView.Text = "very long text"; 

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

La migliore soluzione di lavoro per me (Objective C):

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