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!

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

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


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".

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;

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


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?



6

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

yourTextView.textContainerInset = UIEdgeInsetsZero;

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)

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.

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


0

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


1
Dies ist keine Lösung =)
Ilker Baltaci

0

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

[<#your UITextViewInstance#> setTextContainerInset:UIEdgeInsetsZero];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.