Leerzeichen oben in UITextView in iOS 10

116

Ich habe UITextView mit etwas Text darin. Mit iOS 6 war alles in Ordnung, aber jetzt mit iOS 7 lässt es die Leerstelle oben und platziert den Text dann unter der Mitte der Textansicht.Geben Sie hier die Bildbeschreibung ein

Ich habe kein contentOffSet festgelegt. Bitte helfen Sie!

Ali Sufyan
quelle

Antworten:

217

Eine Textansicht ist eine Bildlaufansicht. Ansichts-Controller fügen den Bildlaufansichten automatisch einen Inhaltsversatz hinzu, da davon ausgegangen wird, dass sie hinter der Navigationsleiste und der Statusleiste nach oben scrollen möchten.

Um dies zu verhindern, legen Sie die folgende Eigenschaft auf dem Ansichtscontroller fest, der die Textansicht enthält:

self.automaticallyAdjustsScrollViewInsets = NO
jrturton
quelle
7
Dies ist eine bessere Antwort, da hier nicht nur erläutert wird, wie das Problem behoben werden kann, sondern auch, warum es überhaupt auftritt.
Stephen Melvin
1
Übrigens müssen Sie nicht unterklassifizieren und überschreiben. Setzen Sie einfach automatischAnjustsScrollViewInsets auf NO, nachdem Sie die UITextView instanziiert haben.
Leftspin
1
@leftspin Es ist ein ziemlich seltener Fall, in dem Sie keinen View Controller unterklassifiziert haben. Wenn Sie die Methode überschreiben, funktioniert Ihr Code auch in niedrigeren iOS-Versionen. Wenn Sie die Eigenschaft festlegen, müssen Sie zuerst eine Kompatibilitätsprüfung durchführen.
Jrturton
1
Befindet sich mein Model View Controller außerhalb von UINavigationController, wird der Offset gelöscht? Es ist irgendwie verrückt ... Dieses Verhalten ist NUR korrekt, wenn meine Textansicht nach oben ausgerichtet ist, sonst ist es Müll ... Kann jemand erklären, warum Apple so etwas getan hat?
Paul Brewczynski
@jrturton entschuldigt sich dafür, dass dies ein älterer Beitrag ist und entschuldige mich bitte, da ich neu bei Objective-C bin, aber dies ist derzeit eine Eigenschaft von UIViewController ... war es früher eine Methode?
Craig
58

Die aktuelle Antwort von IronManGill ist keine gute Lösung, da sie nicht auf dem Verständnis basiert, warum das Problem überhaupt auftritt.

Die Antwort von jrturton ist auch nicht der sauberste Weg, sie zu lösen. Sie müssen nicht überschreiben. Halte es einfach!

Sie müssen lediglich Folgendes einstellen:

self.automaticallyAdjustsScrollViewInsets = NO;

in der viewDidLoad-Methode.

Überprüfen Sie die Dokumente: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin

Dumoko
quelle
1
Änderungen im Storyboard vornehmen ist vielleicht manchmal besser. Gehen Sie zu "Identity Inspector" -> "User Defined Runtime Attributes" und fügen Sie dort eine Definition hinzu.
hufeng03
automaticallyAdjustsScrollViewInsets ist veraltet. Verwenden Sie ab iOS11contentInsetAdjustmentBehavior
Cœur
47

Im Interface Builder

  • Wählen Sie den Ansichts-Controller aus, der die UITextView enthält.
  • Gehen Sie zum Attributinspektor.
  • Deaktivieren Sie "Bildlaufansichten anpassen".
user2268026
quelle
Dies ist die einfachste Lösung für meinen Fall in ios8
Platinor
3
Hinweis: Es ist eine Eigenschaft von UIViewController. Konnte es nicht finden und stellte dann fest, dass ich den Text nicht vollständig gelesen hatte
Maik639
37

Das hat bei mir funktioniert

textView.textContainerInset = UIEdgeInsetsZero;  
textView.textContainer.lineFragmentPadding = 0;
Ravi Bihani
quelle
24

Gehe zu Interface Builder:

  1. Wählen Sie das aus view controller, das Ihre enthälttext view
  2. Deaktivieren Sie die Adjusts Scroll View InsetsEigenschaft

Geben Sie hier die Bildbeschreibung ein

Aamir
quelle
das war was ich suchte. Sie können dies auch tun, indem Sie 'self.automaticallyAdjustsScrollViewInsets = false' zu viewController
CodeOverRide
Dies ist eine gute und direkte Antwort, die gerade meine Suche nach "Warum wird dieser Text nicht angezeigt" beendet hat.
UpSampler
10

Ich frage mich wirklich, ob dies eine echte Funktion ist ... Dieser automatische 64-Punkt-Einschub wird nur hinzugefügt, wenn die UIScrollViewoder UITextViewals die größere Tiefe aller Unteransichten der Ansicht des Ansichts-Controllers. Wenn Sie beispielsweise eine Ansicht hinter der Bildlaufansicht hinzufügen (hier geht es um Z-Buffer, nicht um Ansichtsimbrikation), wird dieser 64-Punkte-Einschub nicht automatisch hinzugefügt.

Zum Beispiel fügt dieser den Einschub hinzu:

Geben Sie hier die Bildbeschreibung ein

In diesem Fall wird der Einschub nicht hinzugefügt:

Geben Sie hier die Bildbeschreibung ein

Das kommt mir wirklich seltsam vor… Warum sollte das Betriebssystem die Tiefe der Ansicht prüfen, um zu entscheiden, ob es die Ansicht erweitern soll?

MonsieurDart
quelle
6

Auf schnell (Xcode 6)

 self.automaticallyAdjustsScrollViewInsets = false
Claudio Barrozo Prado
quelle
Führen Sie dies im viewDidLoadView Controller mit der Textansicht aus.
Suragch
automaticallyAdjustsScrollViewInsets ist veraltet. Verwenden Sie ab iOS11contentInsetAdjustmentBehavior
Cœur
6

Sie können das Leerzeichen über Ihrem löschen, UITextViewindem Sie Folgendes hinzufügen:

yourTextView.textContainerInset = UIEdgeInsetsZero;
lberyouk
quelle
5

Ich habe dieses Problem behoben, indem ich den Inhaltsoffset auf einen negativen Wert gesetzt habe. Hier ist Swift-Code.

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)
Saqib Omer
quelle
Dies war die beste Lösung, um die Einfügungen beizubehalten und unter der durchscheinenden Leiste korrekt zu scrollen. Ich würde diese Änderung vorschlagen. [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason
1
Nichts hat bei mir funktioniert außer diesem. Swift, Xcode 9.1.
Ashok
1

Was Sie verstehen müssen, ist, dass dies mit der Navigationsleiste zusammenhängt:

  • Wenn sich Ihr Inhalt unter der Navigationsleiste befindet, soll der Ansichts-Controller die Bildlaufansichten automatisch anpassen (Standard).
  • Wenn Ihr Inhalt nicht unter der Navigationsleiste angezeigt wird (Sie haben wahrscheinlich die Anleitung für das obere Layout für die Einschränkung des oberen Speicherplatzes verwendet), können Sie die automatische Anpassung der Bildlaufansicht deaktivieren, wie in den meisten anderen Antworten erwähnt.
CodeStage
quelle
1

Ich habe den folgenden Trick ausprobiert, es hat funktioniert.

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

Lösung für Swift 4:

textView.textContainerInset = UIEdgeInsets.zero
Kostas Tsoleridis
quelle
0

Ich bin sicher, dies ist eine unprofessionelle Lösung ... Aber nur ein leeres Etikett hinter der Textansicht löst das Problem.

Terence
quelle
1
Dies ist keine Lösung =)
Ilker Baltaci
0

Dies hat gerade bei mir funktioniert (verfügbar ab iOS 7)

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
RyanTCB
quelle