Wie kann man in UITextView Rand / Abstand verlieren?

486

Ich habe eine UITextViewin meiner iOS-Anwendung, die eine große Menge Text anzeigt.

Ich blättere diesen Text dann mit dem Versatzrandparameter von UITextView.

Mein Problem ist, dass das Auffüllen von UITextViewmeine Berechnungen verwirrt, da es je nach Schriftgröße und Schriftart, die ich verwende, unterschiedlich zu sein scheint.

Daher stelle ich die Frage: Ist es möglich, die den Inhalt des Inhalts umgebende Polsterung zu entfernen UITextView?

Freuen Sie sich auf Ihre Antworten!

sniurkst
quelle
9
Beachten Sie, dass diese Qualitätssicherung fast zehn Jahre alt ist! Mit mehr als 100.000 Views, da dies eines der dümmsten Probleme in iOS ist . Nur FTR Ich habe die aktuelle, 2017, einigermaßen einfache / übliche / akzeptierte Lösung unten als Antwort angegeben.
Fattie
1
Ich bekomme immer noch Updates dazu, nachdem ich 2009, als IOS 3.0 gerade veröffentlicht wurde, eine fest codierte Problemumgehung geschrieben habe. Ich habe die Antwort gerade bearbeitet, um deutlich zu machen, dass sie Jahre veraltet ist, und um den akzeptierten Status zu ignorieren.
Michael

Antworten:

383

Aktuell für 2019

Es ist einer der albernsten Fehler in iOS.

Die hier angegebene Klasse UITextViewFixedist 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!

  1. Die Lösung funktioniert ordnungsgemäß im Storyboard

  2. 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 , UITextViewFixedtut 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 ...

Screenshot von IB mit UITextView

Hier ist UITextViewFixed:

Screenshot von IB mit 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 = 0in 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 UITextViewin 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".

Geben Sie hier die Bildbeschreibung ein

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
}

Geben Sie hier die Bildbeschreibung ein

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

Fattie
quelle
1
Ich habe self.textView.isScrollEnabled = falsedrinnen viewDidLayoutSubviews()und das hat auch funktioniert. Apple mag es einfach, uns durch Reifen springen zu lassen :)
AnBisw
1
Beste Lösung, um alle meine absurden UITextView-Autolayout-Fehler in meinen UITableView-Zellen, Kopf- und Fußzeilen mit dynamischer Höhe (UITableViewAutomaticDimension) zu beheben. Großartig!
Peter Kreinz
1
Ich habe eine aktualisierte Antwort auf @ Fatties Antwort gepostet, die mir geholfen hat, alle Einfügungen mit dem speziellen Trick des Aktivierens / Deaktivierens wirklich loszuwerden translatesAutoresizingMaskIntoConstraints. Mit dieser Antwort allein konnte ich nicht alle Ränder (einige seltsame untere Ränder konnten nicht entfernt werden) in einer Ansichtshierarchie mithilfe des automatischen Layouts entfernen. Es befasst sich auch mit der Berechnung von Ansichtsgrößen mit systemLayoutSizeFitting, die zuvor aufgrund des Buggys eine ungültige Größe zurückgegeben habenUITextView
Fab1n
1
1up für IBDesignable. Ich würde auch für den sehr gut ausgewählten Platzhaltertext
stimmen
1
Ich hatte Textansichten in der Tabelle, diejenigen, die eine einzelne Textzeile hatten, berechneten ihre Höhe nicht richtig (Autolayout). Um das Problem zu beheben, musste ich didMoveToSuperview überschreiben und dort auch das Setup aufrufen.
El Horrible
791

Für iOS 7.0 habe ich festgestellt, dass der contentInset-Trick nicht mehr funktioniert. Dies ist der Code, mit dem ich den Rand / das Auffüllen in iOS 7 entfernt habe.

Dies bringt den linken Rand des Textes an den linken Rand des Containers:

textView.textContainer.lineFragmentPadding = 0

Dadurch wird die Oberseite des Texts an der Oberseite des Containers ausgerichtet

textView.textContainerInset = .zero

Beide Linien werden benötigt, um den Rand / die Polsterung vollständig zu entfernen.

user1687195
quelle
2
Dies funktioniert für mich für zwei Zeilen, aber wenn ich 5 Zeilen erreiche, wird der Text abgeschnitten.
livings124
7
Beachten Sie, dass die zweite Zeile auch geschrieben werden kann als: self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
Jessepinho
19
Das Setzen lineFragmentPaddingauf 0 ist die Magie, nach der ich gesucht habe. Ich habe keine Ahnung, warum Apple es so schwierig macht, UITextView-Inhalte mit anderen Steuerelementen abzustimmen.
Phatmann
3
Dies ist die richtige Antwort. Horizontales Scrollen ist bei dieser Lösung nicht möglich.
Michael
2
lineFragmentPaddingist nicht dazu gedacht, Ränder zu ändern. Aus den Dokumenten Das Auffüllen von Zeilenfragmenten dient nicht zum Ausdrücken von Texträndern. Stattdessen sollten Sie Einfügungen in Ihrer Textansicht verwenden, die Absatzrandattribute anpassen oder die Position der Textansicht in ihrer Übersicht ändern.
Martin Berger
256

Diese Problemumgehung wurde 2009 geschrieben, als IOS 3.0 veröffentlicht wurde. Es gilt nicht mehr.

Ich hatte genau das gleiche Problem, am Ende musste ich es benutzen

nameField.contentInset = UIEdgeInsetsMake(-4,-8,0,0);

Dabei ist nameField a UITextView. Die Schriftart, die ich zufällig verwendete, war Helvetica 16 point. Es ist nur eine benutzerdefinierte Lösung für die bestimmte Feldgröße, die ich gezeichnet habe. Dadurch wird der linke Versatz bündig mit der linken Seite und der obere Versatz dort, wo ich ihn für die Box haben möchte, eingezogen.

Darüber hinaus scheint dies nur dort zu gelten, UITextViewswo Sie die Standardausrichtung verwenden, d. H.

nameField.textAlignment = NSTextAlignmentLeft;

Richten Sie sich zum Beispiel nach rechts aus und das UIEdgeInsetsMakescheint überhaupt keinen Einfluss auf die rechte Kante zu haben.

Zumindest können Sie mit der Eigenschaft .contentInset Ihre Felder an den "richtigen" Positionen platzieren und die Abweichungen berücksichtigen, ohne Ihre zu versetzen UITextViews.

Michael
quelle
1
Ja, es funktioniert unter iOS 7. Stellen Sie sicher, dass das UIEdgeInset auf die richtigen Werte eingestellt ist. Dies kann sich von UIEdgeInsetsMake (-4, -8,0,0) unterscheiden.
App_
15
In IOS 7 fand ich, dass UIEdgeInsetsMake (0, -4,0, -4) am besten funktioniert.
Racura
2
Ja, das sind Beispielnummern. Ich sagte: "Es ist nur eine benutzerdefinierte Lösung für die bestimmte Feldgröße, die ich gezeichnet habe." Hauptsächlich habe ich versucht zu veranschaulichen, dass Sie mit den Zahlen für Ihre einzigartige Layoutsituation spielen müssen.
Michael
3
UITextAlignmentLeft ist in iOS 7 veraltet. Verwenden Sie NSTextAlignmentLeft.
Jordi Kroon
7
Ich verstehe nicht, warum Leute eine Antwort, die fest codierte Werte verwendet, positiv bewerten. Es ist SEHR wahrscheinlich, dass es in zukünftigen Versionen von iOS kaputt geht, und es ist einfach eine schlechte Idee.
ldoogy
77

Aufbauend auf einigen der bereits gegebenen guten Antworten finden Sie hier eine rein auf Storyboard / Interface Builder basierende Lösung, die unter iOS 7.0+ funktioniert

Legen Sie die benutzerdefinierten Laufzeitattribute von UITextView für die folgenden Schlüssel fest:

textContainer.lineFragmentPadding
textContainerInset

Interface Builder

Azdev
quelle
4
Dies ist eindeutig die beste Antwort, insbesondere wenn Sie eine Nur-XIB-Lösung benötigen
Yano
16
Kopieren / Einfügen: textContainer.lineFragmentPadding | textContainerInset
Luca De Angelis
3
Dies ist, was eine schöne Antwort macht - einfach und funktioniert gut, auch nach 3 Jahren :)
Shai Mishali
46

Unter iOS 5 UIEdgeInsetsMake(-8,-8,-8,-8);scheint das großartig zu funktionieren.

Engin Kurutepe
quelle
41

Ich würde auf jeden Fall Antworten mit fest codierten Werten vermeiden, da sich die tatsächlichen Ränder mit den Einstellungen für die Schriftgröße des Benutzers usw. ändern können.

Hier ist die Antwort von @ user1687195, die ohne Änderung von geschrieben wurde textContainer.lineFragmentPadding(da in den Dokumenten angegeben ist, dass dies nicht die beabsichtigte Verwendung ist).

Dies funktioniert hervorragend für iOS 7 und höher.

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding, 
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding);

Dies ist praktisch das gleiche Ergebnis, nur ein bisschen sauberer, da die lineFragmentPadding-Eigenschaft nicht missbraucht wird.

ldoogy
quelle
Ich habe eine andere Lösung basierend auf dieser Antwort ausprobiert und sie funktioniert hervorragend. Die Lösungen sind:self.textView.textContainer.lineFragmentPadding = 0;
Bakyt Abdrasulov
1
@ BakytAbdrasulov bitte lesen Sie meine Antwort. Während Ihre Lösung funktioniert, stimmt sie nicht mit den Dokumenten überein (siehe den Link in meiner Antwort). lineFragmentPaddingist nicht dazu gedacht, die Ränder zu kontrollieren. Deshalb solltest du verwenden textContainerInset.
ldoogy
20

Storyboard- oder Interface Builder-Lösung mit benutzerdefinierten Laufzeitattributen :

Screenshots sind von iOS 7.1 & iOS 6.1 mit contentInset = {{-10, -5}, {0, 0}}.

Benutzerdefinierte Laufzeitattribute

Ausgabe

Uladzimir
quelle
1
Arbeitete für mich in iOS 7.
Kubilay
Nur für benutzerdefinierte Laufzeitattribute - großartig!
Bis zum
16

Alle diese Antworten befassen sich mit der Titelfrage, aber ich wollte einige Lösungen für die Probleme vorschlagen, die im Hauptteil der OP-Frage dargestellt sind.

Größe des Textinhalts

Eine schnelle Möglichkeit, die Größe des Textes im zu berechnen, UITextViewist die Verwendung von NSLayoutManager:

UITextView *textView;
CGSize textSize = [textView usedRectForTextContainer:textView.textContainer].size;

Dies ergibt den gesamten scrollbaren Inhalt, der möglicherweise größer als der UITextViewFrame des Frames ist. Ich fand das viel genauer als textView.contentSizeda es tatsächlich berechnet, wie viel Platz der Text einnimmt. Zum Beispiel bei einem leeren UITextView:

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

Zeilenhöhe

UIFonthat eine Eigenschaft, mit der Sie schnell die Zeilenhöhe für die angegebene Schriftart ermitteln können. So können Sie schnell die Zeilenhöhe des Textes in Ihrem UITextViewmit finden:

UITextView *textView;
CGFloat lineHeight = textView.font.lineHeight;

Berechnung der sichtbaren Textgröße

Das Bestimmen der tatsächlich sichtbaren Textmenge ist wichtig für die Behandlung eines "Paging" -Effekts. UITextViewhat eine Eigenschaft namens, textContainerInsetdie tatsächlich einen Rand zwischen dem tatsächlichen UITextView.frameund dem Text selbst darstellt. Um die tatsächliche Höhe des sichtbaren Rahmens zu berechnen, können Sie die folgenden Berechnungen durchführen:

UITextView *textView;
CGFloat textViewHeight = textView.frame.size.height;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textHeight = textViewHeight - textInsets.top - textInsets.bottom;

Bestimmen der Paging-Größe

Schließlich jetzt , dass Sie die sichtbaren Textgröße und den Inhalt haben, können Sie schnell feststellen , was Ihre Offsets das sein sollte , durch Subtraktion textHeightvon der textSize:

// where n is the page number you want
CGFloat pageOffsetY = textSize - textHeight * (n - 1);
textView.contentOffset = CGPointMake(textView.contentOffset.x, pageOffsetY);

// examples
CGFloat page1Offset = 0;
CGFloat page2Offset = textSize - textHeight
CGFloat page3Offset = textSize - textHeight * 2

Mit all diesen Methoden habe ich meine Einfügungen nicht berührt und konnte zum Caret oder zu einer beliebigen Stelle im gewünschten Text gehen.

mikeho
quelle
12

Sie können die textContainerInsetEigenschaft von verwenden UITextView:

textView.textContainerInset = UIEdgeInsetsMake (10, 10, 10, 10);

(oben links unten rechts)

Himanshu Padia
quelle
1
Ich frage mich, warum dies hier nicht die beste Antwort ist. Das textContainerInset hat meine Bedürfnisse wirklich erfüllt.
KoreanXcodeWorker
Das Aktualisieren des unteren Werts für die textContainerInsetEigenschaft funktioniert bei mir nicht, wenn ich ihn in einen neuen Wert ändern möchte - siehe stackoverflow.com/questions/19422578/… .
Evan R
@MaggiePhillips Dies ist nicht die beste Antwort, da fest codierte Werte möglicherweise nicht der richtige Weg sind und in einigen Fällen garantiert fehlschlagen. Sie müssen lineFragmentPadding berücksichtigen.
ldoogy
11

Unter iOS 10 funktioniert die folgende Zeile zum Entfernen der oberen und unteren Polsterung.

captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
Anson Yao
quelle
Xcode 8.2.1. immer noch das gleiche Problem wie in dieser Antwort erwähnt. Meine Lösung bestand darin, die Werte als UIEdgeInsets zu bearbeiten (oben: 0, links: -4.0, unten: 0, rechts: -4.0).
Darkwonder
UIEdgeInset.zerofunktioniert mit XCode 8.3 und iOS 10.3 Simulator
Simon Warta
10

Neueste Swift:

self.textView.textContainerInset = .init(top: -2, left: 0, bottom: 0, right: 0)
self.textView.textContainer.lineFragmentPadding = 0
Urvish Modi
quelle
Gute Antwort. Diese Antwort entfernt den zusätzlichen oberen Einschub. textView.textContainerInset = UIEdgeInsets.zero entfernt keine 2 Pixel aus dem oberen Einschub.
Korgx9
10

Hier ist eine aktualisierte Version von Fatties sehr hilfreicher Antwort. Es werden zwei wichtige Zeilen hinzugefügt, die mir geholfen haben, das Layout für iOS 10 und 11 (und wahrscheinlich auch für niedrigere) zum Laufen zu bringen:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

Die wichtigen Zeilen sind die beiden translatesAutoresizingMaskIntoConstraints = <true/false>Aussagen!

Dies entfernt überraschenderweise alle Ränder unter all meinen Umständen!

Obwohl der textViewnicht der Ersthelfer ist, kann es vorkommen, dass es einen merkwürdigen unteren Rand gibt, der mit der sizeThatFitsin der akzeptierten Antwort genannten Methode nicht gelöst werden kann .

Beim Tippen auf die Textansicht verschwand plötzlich der seltsame untere Rand und alles sah so aus, wie es sollte, aber nur sobald die Textansicht fertig ist firstResponder.

Daher habe ich hier auf SO gelesen , dass das Aktivieren und Deaktivieren translatesAutoresizingMaskIntoConstraintshilfreich ist, wenn der Frame / die Grenzen zwischen den Aufrufen manuell festgelegt werden.

Glücklicherweise funktioniert dies nicht nur mit der Rahmeneinstellung, sondern auch mit den 2 Zeilen setup()zwischen den beiden translatesAutoresizingMaskIntoConstraintsAufrufen!

Dies ist beispielsweise sehr hilfreich, wenn Sie den Rahmen einer Ansicht mit systemLayoutSizeFittingaUIView berechnen . Gibt die richtige Größe zurück (was vorher nicht der Fall war)!

Wie in der ursprünglichen Antwort erwähnt:
Vergessen Sie nicht, scrollEnabled im Inspector zu deaktivieren!
Diese Lösung funktioniert sowohl im Storyboard als auch zur Laufzeit einwandfrei.

Das war's, jetzt bist du wirklich fertig!

Fab1n
quelle
5

Für Swift 4 Xcode 9

Mit der folgenden Funktion können Sie den Rand / die Auffüllung des Textes in UITextView ändern

public func UIEdgeInsetsMake (_ oben: CGFloat, _ links: CGFloat, _ unten: CGFloat, _ rechts: CGFloat) -> UIEdgeInsets

so ist in diesem Fall

 self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
Shan Ye
quelle
3

Beim Einsetzen der Lösung hatte ich immer noch Polster auf der rechten Seite und am Boden. Auch die Textausrichtung verursachte Probleme. Der einzig sichere Weg, den ich gefunden habe, bestand darin, die Textansicht in eine andere Ansicht zu verschieben, die an Grenzen gebunden ist.

rp90
quelle
3

Hier ist eine einfache kleine Erweiterung, mit der der Standardrand von Apple aus jeder Textansicht in Ihrer App entfernt wird.

Hinweis: Interface Builder zeigt weiterhin den alten Rand an, aber Ihre App funktioniert wie erwartet.

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}
Cal S.
quelle
1

Für mich (iOS 11 & Xcode 9.4.1) funktionierte es auf magische Weise, die Eigenschaft textView.font nach UIFont.preferred(forTextStyle:UIFontTextStyle) Stil einzurichten und auch die erste Antwort, wie von @Fattie erwähnt. Aber die @ Fattie-Antwort hat nicht funktioniert, bis ich die Eigenschaft textView.font festgelegt habe. Andernfalls verhält sich UITextView weiterhin unregelmäßig.

Nikhil Pandey
quelle
1

Falls jemand nach der neuesten Swift-Version sucht, funktioniert der folgende Code mit Xcode 10.2 und Swift 4.2 einwandfrei

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
Bhavin_m
quelle
0

Ich habe einen weiteren Ansatz gefunden, bei dem die Ansicht mit Text aus den Unteransichten von UITextView abgerufen und in der layoutSubview-Methode einer Unterklasse eingerichtet wird:

- (void)layoutSubviews {
    [super layoutSubviews];

    const int textViewIndex = 1;
    UIView *textView = [self.subviews objectAtIndex:textViewIndex];
    textView.frame = CGRectMake(
                                 kStatusViewContentOffset,
                                 0.0f,
                                 self.bounds.size.width - (2.0f * kStatusViewContentOffset),
                                 self.bounds.size.height - kStatusViewContentOffset);
}
Nikita
quelle
0

Das Scrollen in textView wirkt sich auch auf die Position des Texts aus und lässt ihn so aussehen, als wäre er nicht vertikal zentriert. Ich habe es geschafft, den Text in der Ansicht zu zentrieren, indem ich das Scrollen deaktiviert und den oberen Einschub auf 0 gesetzt habe:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

Aus irgendeinem Grund habe ich es noch nicht herausgefunden. Der Cursor ist immer noch nicht zentriert, bevor die Eingabe beginnt, aber der Text wird sofort zentriert, wenn ich mit der Eingabe beginne.

Alex
quelle
0

Wenn Sie eine HTML-Zeichenfolge festlegen und die untere Auffüllung vermeiden möchten, stellen Sie bitte sicher, dass Sie keine Block-Tags verwenden, z. B. div, p.

In meinem Fall war dies der Grund. Sie können es einfach testen, indem Sie das Auftreten von Block-Tags durch das span-Tag ersetzen.

Dawid Płatek
quelle
0

Für SwiftUI

Wenn Sie mit TextView eine eigene Textansicht erstellen UIViewRepresentableund die Auffüllung steuern möchten, gehen Sie in Ihrer makeUIViewFunktion einfach wie folgt vor :

uiTextView.textContainerInset = UIEdgeInsets(top: 10, left: 18, bottom: 0, right: 18)

oder was auch immer du willst.

P. Ent
quelle
-4
[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
to0nice4eva
quelle