Aktuell für 2019
Es ist einer der albernsten Fehler in iOS.
Die hier angegebene Klasse UITextViewFixed
ist normalerweise die vernünftigste Lösung insgesamt.
Hier ist die Klasse:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Vergessen Sie nicht, scrollEnabled im Inspector zu deaktivieren!
Die Lösung funktioniert ordnungsgemäß im Storyboard
Die Lösung funktioniert zur Laufzeit ordnungsgemäß
Das war's, du bist fertig.
Im Allgemeinen sollte dies in den meisten Fällen alles sein, was Sie benötigen .
Selbst wenn Sie die Höhe der Textansicht ändern on the fly , UITextViewFixed
tut in der Regel alles , was Sie brauchen.
(Ein häufiges Beispiel für das schnelle Ändern der Höhe ist das Ändern während der Benutzertypen.)
Hier ist das kaputte UITextView von Apple ...
Hier ist UITextViewFixed
:
Beachten Sie, dass Sie natürlich müssen
Schalten Sie scrollEnabled im Inspector aus!
Vergessen Sie nicht, scrollEnabled auszuschalten! :) :)
Einige weitere Probleme
(1) In einigen ungewöhnlichen Fällen - zum Beispiel bei Tabellen mit flexiblen, sich dynamisch ändernden Zellenhöhen - macht Apple eine bizarre Sache: Sie fügen unten zusätzlichen Platz hinzu . Nicht wirklich! Dies müsste eines der ärgerlichsten Dinge in iOS sein.
Hier ist eine "schnelle Lösung", die zu den oben genannten hinzugefügt werden kann und normalerweise bei diesem Wahnsinn hilft.
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but you can sometimes use this
// to fix the "extra space at the bottom" insanity
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) Manchmal müssen Sie Folgendes hinzufügen, um ein weiteres subtiles Apple-Durcheinander zu beheben:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) Wir sollten wohl hinzufügen:
contentInset = UIEdgeInsets.zero
gleich nach .lineFragmentPadding = 0
in UITextViewFixed
.
Aber ... ob Sie es glauben oder nicht ... es funktioniert einfach nicht in aktuellem iOS! (Überprüft im Jahr 2019.) Möglicherweise muss diese Zeile in Zukunft hinzugefügt werden.
Die Tatsache, dass UITextView
in iOS kaputt ist, ist eines der seltsamsten Dinge im gesamten mobilen Computing. Zehnjähriges Jubiläum dieser Frage und es ist immer noch nicht behoben!
Schließlich ist hier eine etwas ähnliche Spitze für Text - Feld : https://stackoverflow.com/a/43099816/294884
Völlig zufälliger Tipp: Wie man das "..." am Ende hinzufügt
Oft verwenden Sie eine UITextView "wie ein UILabel". Sie möchten also, dass Text mit einem Auslassungszeichen "..." abgeschnitten wird.
Wenn ja, fügen Sie im "Setup" eine dritte Codezeile hinzu:
textContainer.lineBreakMode = .byTruncatingTail
Praktischer Tipp, wenn Sie eine Höhe von Null wünschen, wenn überhaupt kein Text vorhanden ist
Oft verwenden Sie eine Textansicht, um nur Text anzuzeigen. Der Benutzer kann also eigentlich nichts bearbeiten. Sie verwenden die Zeilen "0", um zu bedeuten, dass die Textansicht die Höhe abhängig von der Anzahl der Textzeilen automatisch ändert.
Das ist großartig, aber wenn es überhaupt keinen Text gibt, erhalten Sie leider die gleiche Höhe, als ob es eine Textzeile gibt !! Die Textansicht "geht nie weg".
Wenn Sie möchten, dass es "verschwindet", fügen Sie dies einfach hinzu
override var intrinsicContentSize: CGSize {
var i = super.intrinsicContentSize
print("for \(text) size will be \(i)")
if text == "" { i.height = 1.0 }
print(" but we changed it to \(i)")
return i
}
(Ich habe es auf '1' gesetzt, damit klar ist, was los ist. '0' ist in Ordnung.)
Was ist mit UILabel?
Wenn nur Text angezeigt wird, bietet UILabel viele Vorteile gegenüber UITextView. UILabel leidet nicht unter den auf dieser QS-Seite beschriebenen Problemen. Der Grund, warum wir alle normalerweise "aufgeben" und nur UITextView verwenden, ist, dass es schwierig ist, mit UILabel zu arbeiten. Insbesondere ist es lächerlich schwierig nur hinzufügen , padding , richtig, zu UILabel. In der Tat finden Sie hier eine vollständige Diskussion darüber, wie Sie UILabel "endlich" korrekt mit Padding versehen können: https://stackoverflow.com/a/58876988/294884 In einigen Fällen ist es manchmal schwierig, ein Layout mit dynamischen Höhenzellen zu erstellen Besser auf die harte Tour mit UILabel.