Spazio vuoto nella parte superiore di UITextView in iOS 10


116

Ho UITextView con del testo in esso. Tutto andava bene con iOS 6 ma ora con iOS 7 lascia lo spazio vuoto in alto e quindi posiziona il testo sotto il centro della visualizzazione di testo.inserisci qui la descrizione dell'immagine

Non ho impostato alcun contentOffSet. Per favore aiuto!

Risposte:


217

Una visualizzazione di testo è una visualizzazione a scorrimento. I controller di visualizzazione aggiungeranno automaticamente un offset del contenuto per scorrere le visualizzazioni, poiché si presume che vogliano scorrere verso l'alto dietro la barra di navigazione e la barra di stato.

Per evitare ciò, impostare la seguente proprietà sul controller della vista contenente la vista del testo:

self.automaticallyAdjustsScrollViewInsets = NO

7
Questa è una risposta migliore perché affronta non solo come correggere il problema, ma perché si verifica in primo luogo.
Stephen Melvin

1
BTW, non è necessario creare sottoclassi e sovrascrivere. Basta impostare automaticamenteAdjustsScrollViewInsets su NO dopo aver istanziato UITextView.
leftspin

1
@leftspin è un caso piuttosto raro in cui non hai sottoclasse un controller di visualizzazione. E ignorare il metodo significa che il tuo codice continuerà a funzionare su versioni iOS precedenti: l'impostazione della proprietà significa che devi prima un controllo di compatibilità.
jrturton

1
Quindi se il mio Model View Controller è esterno a UINavigationController, l'offset verrebbe cancellato? È un po 'folle ... Questo comportamento è corretto SOLO quando la mia visualizzazione del testo è allineata in alto, altrimenti è spazzatura ... Qualcuno potrebbe spiegare perché Apple ha fatto qualcosa del genere?
Paul Brewczynski

@jrturton si scusa per questo è un post più vecchio e per favore scusami perché sono nuovo in Objective-C ma questa è attualmente una proprietà di UIViewController ... era un metodo?
Craig

58

L'attuale risposta fornita da IronManGill non è una buona soluzione, perché non si basa sulla comprensione del motivo per cui il problema si verifica in primo luogo.

La risposta di jrturton non è nemmeno il modo più pulito per risolverlo. Non è necessario eseguire l'override. Mantienilo semplice!

Tutto ciò di cui hai bisogno è impostare quanto segue:

self.automaticallyAdjustsScrollViewInsets = NO;

nel metodo viewDidLoad.

Guarda i documenti: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin


1
Apportare modifiche nello storyboard forse a volte è meglio. Vai a "Identity Inspector" -> "Attributi di runtime definiti dall'utente" e aggiungi una definizione lì.
hufeng03

automaticallyAdjustsScrollViewInsets è deprecato. Da iOS11, usacontentInsetAdjustmentBehavior
Cœur

47

In Interface Builder,

  • Seleziona il controller di visualizzazione che contiene UITextView.
  • Vai all'ispettore degli attributi.
  • Deseleziona "Regola riquadri di visualizzazione a scorrimento".

Questa è la soluzione più semplice per il mio caso in iOS8
platino

3
Nota: è una proprietà di UIViewController. Non sono riuscito a trovarlo e poi mi sono reso conto di non aver letto completamente il testo
Maik639

37

Questo ha funzionato per me

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;

24

Vai a Interface Builder:

  1. Seleziona view controllerquello che contiene il tuotext view
  2. deseleziona Adjusts Scroll View Insetsproprietà

inserisci qui la descrizione dell'immagine


questo era quello che stavo cercando. puoi anche farlo aggiungendo 'self.automaticallyAdjustsScrollViewInsets = false' a viewController
CodeOverRide

Questa è una risposta buona e immediata, che ha appena concluso la mia ricerca di "perché questo testo non viene visualizzato".
UpSampler

10

Mi chiedo davvero se questa sia una caratteristica reale ... Questo riquadro automatico a 64 punti viene aggiunto solo quando UIScrollViewo UITextViewcome maggiore profondità di tutte le sottoview della vista del controller di visualizzazione. Ad esempio, se aggiungi una vista dietro (qui sto parlando di z-buffer, non di imbricazione della vista) la vista a scorrimento, questo riquadro di 64 punti non viene aggiunto automaticamente.

Ad esempio, questo aggiunge il riquadro:

inserisci qui la descrizione dell'immagine

In questo caso, il riquadro non viene aggiunto:

inserisci qui la descrizione dell'immagine

Questo mi sembra davvero strano ... Perché il sistema operativo dovrebbe esaminare la profondità della visualizzazione per decidere se estenderla?



6

Puoi eliminare lo spazio vuoto sopra il tuo UITextViewaggiungendo:

yourTextView.textContainerInset = UIEdgeInsetsZero;

5

Ho risolto questo problema impostando l'offset del contenuto su un valore negativo. Ecco il codice Swift.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)

Questa era la soluzione migliore per mantenere correttamente gli inserti e lo scorrimento sotto la barra traslucida. Suggerirei questa modifica. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason

1
Niente ha funzionato per me tranne questo. Swift, Xcode 9.1.
Ashok

1

Quello che devi capire è che questo si riferisce alla barra di navigazione:

  • Se il contenuto si trova sotto la barra di navigazione, si desidera che il controller della vista regoli automaticamente i riquadri della visualizzazione a scorrimento (impostazione predefinita).
  • Se il tuo contenuto non va sotto la barra di navigazione (probabilmente hai utilizzato la guida del layout superiore per il vincolo di spazio in alto), puoi disabilitare la regolazione automatica dell'inserimento della vista a scorrimento come menzionato nella maggior parte delle altre risposte.

1

Ho provato il seguente trucco, ha funzionato.

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}


0

Questa è una soluzione poco professionale, ne sono sicuro ... Ma solo mettere un'etichetta vuota dietro la visualizzazione del testo risolve il problema.


1
questa non è una soluzione =)
Ilker Baltaci

0

Questo ha funzionato per me (disponibile da iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.