Ich möchte den Text von a einfügen UITextField
.
Ist das möglich?
ios
cocoa-touch
uitextfield
RunLoop
quelle
quelle
Antworten:
Durch das Überschreiben
-textRectForBounds:
wird nur der Einschub des Platzhaltertextes geändert. Um den Einschub des bearbeitbaren Textes zu ändern, müssen Sie auch überschreiben-editingRectForBounds:
quelle
UITextField
es sich innerhalb von a befindetUIScrollView
.- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
Hier zu finden: stackoverflow.com/questions/5361369/…Ich konnte es schaffen durch:
Denken Sie natürlich daran, QuartzCore zu importieren und das Framework zu Ihrem Projekt hinzuzufügen.
quelle
UITextField
Überlappt den Inhalt auf der rechten Seite.Wenn Sie nur einen linken Rand benötigen, können Sie Folgendes versuchen:
Für mich geht das. Ich hoffe das kann helfen.
quelle
leftView.backgroundColor = textField.backgroundColor;
... Abgesehen von dieser großartigen Lösung ... Danke (:Überschreiben Sie in einer von UITextField abgeleiteten Klasse mindestens diese beiden Methoden:
Es könnte so einfach sein, wenn Sie keinen zusätzlichen Inhalt haben:
UITextField bietet verschiedene Positionierungsmethoden, die Sie überschreiben können.
quelle
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Wie über eine
@IBInspectable
,@IBDesignable
schnelle Klasse.Sie sehen dies in Ihrem Storyboard.
Update - Swift 3
quelle
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/editingRect
) auf die Bildlaufleistung aus (zumindest unter iOS 12), wenn der Text über das sichtbare Rechteck hinausläuft. Mit einem Einschub von 15 hört es sogar auf zu scrollen.Wenn Sie eine Schaltfläche zum Löschen haben, funktioniert die akzeptierte Antwort für Sie nicht. Wir sollten uns auch davor schützen, dass Apple in Zukunft etwas ändert, indem wir anrufen
super
.Um sicherzustellen, dass der Text die Schaltfläche zum Löschen nicht überlappt, müssen Sie zuerst den Standardwert ermitteln
super
und dann nach Bedarf anpassen.Dieser Code fügt oben, links und unten im Textfeld 10px-Einfügungen hinzu:
Hinweis: UIEdgeInsetsMake akzeptiert Parameter in der Reihenfolge: oben , links , unten , rechts .
quelle
textRectForBounds:
undeditingRectForBounds:
Methoden ohneclearButtonRectForBounds:
iOS 7+ haben bei mir funktioniert.clearButtonRectForBounds:
hilft nur, den Löschknopf ein wenig nach links zu bewegen. Vielleicht möchten Sie es weglassen. Mein Textfeld befand sich auf einem dunklen Hintergrund, und für die Schaltfläche zum Löschen war rechts eine zusätzliche Polsterung erforderlich.Ich dachte, ich würde eine schnelle Lösung liefern
Swift 3+
quelle
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
ist der Platzhalter ebenfalls betroffen , wenn Sie ihn überschreiben. Wenn Sie also den Platzhalter überschreiben, wird der Platzhalter um weitere 10 Punkte erweitert. Wenn es das ist, wonach Sie suchen, 👍🏼, aber wenn nicht, ist es gut, sich dessen bewusst zu sein.Verwenden
textRectForBounds:
ist der richtige Ansatz. Ich habe dies in meiner Unterklasse zusammengefasst, damit Sie es einfach verwenden könnentextEdgeInsets
. Siehe SSTextField .quelle
Schnell
quelle
Für Leute, die nach einer einfacheren Lösung suchen.
Fügen Sie das
UITextField
Innere hinzu aUIView
. Um einen Einschub um ein Textfeld zu simulieren, halte ich 10 Pixel links und die Breite ist 20 Pixel kleiner als die Ansicht. Verwenden Sie für einen abgerundeten Eckrand um das Textfeld den Rand der Ansichtquelle
UITextView
vielleicht?Sie können die Texteinfügung für UITextField festlegen, indem Sie die linke Ansicht festlegen.
So was:
quelle
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
Schnell
quelle
Ein guter Ansatz zum Hinzufügen von Auffüllungen zu UITextField besteht darin, UITextField in Unterklassen zu unterteilen und eine edgeInsets-Eigenschaft hinzuzufügen. Anschließend legen Sie die edgeInsets fest und das UITextField wird entsprechend gezeichnet. Dies funktioniert auch korrekt mit einem benutzerdefinierten leftView- oder rightView-Set.
OSTextField.h
OSTextField.m
quelle
Swift 3 / Designable in Interface Builder / Separate horizontale und vertikale Insekten / sofort einsatzbereit
Verwendungszweck:
&
quelle
Ich habe dies in IB gemacht, wo ich eine UIView hinter der TextView erstellt habe, die etwas länger war. Wenn die Hintergrundfarbe von textField auf klar eingestellt ist.
quelle
Es ist der schnellste Weg, den ich gefunden habe, ohne Unterklassen zu machen:
In Swift:
quelle
Hier ist das gleiche UITextField der Unterklasse, das in Swift 3 geschrieben wurde. Es unterscheidet sich erheblich von früheren Versionen von Swift, wie Sie sehen werden:
Im Übrigen können Sie auch Folgendes tun, wenn Sie den Einschub nur einer Seite steuern möchten. Dieses spezielle Beispiel zum Anpassen nur des linken Einschubs ist nützlich, wenn Sie ein Bild über dem UITextField platzieren, es dem Benutzer jedoch im Textfeld anzeigen soll:
quelle
Swift 4.2 Version:
quelle
Sie können die Position des Texts in einem Textfeld anpassen, indem Sie ihn zu einer Unterklasse
UITextField
der-textRectForBounds:
Methode machen und diese überschreiben .quelle
Es ist absurd, dass Sie eine Unterklasse bilden müssen, da
UITextField
die Methoden bereits implementiert sind, wie @Adam Waite betont. Hier ist eine schnelle Erweiterung, die eine Factory-Methode verfügbar macht, die auch in unseren Kategorien repo verfügbar ist :quelle
Ich habe UITextField untergeordnet, um dies zu handhaben, das den linken, oberen, rechten und unteren Einschub sowie das Löschen der Tastenpositionierung unterstützt.
MRDInsetTextField.h
MRDInsetTextField.m
Anwendungsbeispiel, bei dem * _someTextField * aus der Nib / Storyboard-Ansicht mit der benutzerdefinierten MRDInsetTextField- Klasse stammt
quelle
Dies ist nicht so kurz wie die anderen Beispiele, verfolgt jedoch einen völlig anderen Ansatz zur Lösung dieses Problems. Beachten Sie, dass das Caret weiterhin bündig mit dem linken Rand beginnt, der Text jedoch beim Eingeben / Anzeigen ordnungsgemäß eingerückt wird. Dies funktioniert ohne Unterklassen, wenn Sie nur einen linken Rand suchen und ihn bereits
UITextFieldDelegate
für Ihre Textfelder verwenden. Sie müssen sowohl die Standardtextattribute als auch die Typattribute festlegen. Sie legen die Standardtextattribute fest, wenn Sie das Textfeld erstellen. Die Typattribute, die Sie im Delegaten festlegen müssen. Wenn Sie auch einen Platzhalter verwenden, möchten Sie diesen ebenfalls auf den gleichen Rand setzen. Alles in allem erhalten Sie so etwas.Erstellen Sie zunächst eine Kategorie für die
UITextField
Klasse.Wenn Sie dann platzierte Halter verwenden, stellen Sie sicher, dass Sie einen zugewiesenen Platzhalter verwenden, der denselben Einzug setzt. Erstellen Sie ein Standardwörterbuch mit den richtigen Attributen:
Importieren Sie dann die obige Kategorie und legen Sie beim Erstellen eines Textfelds den Standardeinzug, den Delegaten und die oben definierten Standardplatzhalterattribute fest. Zum Beispiel:
Implementieren Sie schließlich im Delegaten die
textFieldDidBeginEditing
Methode wie folgt:quelle
defaultTextAttributes
enthält,NSMutableParagraphStyle
ist ziemlich gefährlich. Ich würde das alles lieber veränderlich kopieren.Normalerweise versuche ich, Unterklassen zu vermeiden, aber das funktioniert, wenn Sie bereits:
quelle
So werfen Sie eine andere Lösung ein, für die keine Unterklassen erforderlich sind:
Getestet mit iOS 7 und iOS 8. Beide funktionieren. Dennoch besteht möglicherweise die Möglichkeit, dass Apple die Ebenenhierarchie von UITextField ändert, was die Dinge stark durcheinander bringt.
quelle
Hier ist eine umfassende Swift-Antwort, die eine leftView (benutzerdefiniertes Symbol) und eine benutzerdefinierte Schaltfläche zum Löschen enthält, die beide im Interface Builder mit anpassbaren Einfügungen festgelegt sind.
quelle
Eine Lösung, die tatsächlich funktioniert und alle Fälle abdeckt:
offsetBy
nicht verwendeninsetBy
.Rect
.Stichprobe:
quelle
Wenn Sie den Einzug oben und links nur dann ändern möchten
// Platzhalterposition
// Textposition
quelle
Schnelle Lösung ohne Unterklasse und auch inspizierbar
quelle