Ich würde gerne die Text eines UITextField
.
Ist dies möglich?
Ich würde gerne die Text eines UITextField
.
Ist dies möglich?
Übergeordnetes Recht -textRectForBounds:
wird nur der Einschub des Platzhaltertextes geändert. Um den Einschub des bearbeitbaren Textes zu ändern, müssen Sie auch die -editingRectForBounds:
// placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 10, 10);
}
// text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 10, 10);
}
Diese Lösung hat bei mir funktioniert, obwohl ich einen Rückgabewert von CGRectInset(bounds, 9, 0) verwendet habe; ich musste diesen Wert auch für textRectForBounds, editingRectForBounds und placeholderRectForBounds festlegen.
Diese Lösung verträgt sich nicht gut mit clearButton. Der Text im TextField überlagert die Schaltfläche.
Ich denke, das Überschreiben der oben genannten Methoden wird das Blättern verlangsamen, wenn UITextField
befindet sich innerhalb einer UIScrollView
.
+1 für Kreativität, aber das ist ein bisschen problematisch, es verschiebt auch die Löschtaste im Textfeld
Sie könnten myTextField.layer.sublayers tun, die ein Array aller Unterebenen ist... und wenn seine UIImageView <- Ich nehme an, dass das X ein Bild ist... oder vielleicht UIButton... oder Sie könnten Schleife durch jede und sehen, welche zu welcher Unteransicht gehört... aber myfield.layer.sublayerTransform alle Unterebenen und damit die X-Schaltfläche bewegen sowie...
Diese Lösung funktioniert bei mir nicht. Ich kann nur den linken und oberen Rand einstellen, aber nicht den rechten und unteren. UITextField
überschneidet sich mit dem Inhalt auf der rechten Seite der Seite.
Wenn Sie nur einen linken Rand benötigen, können Sie dies versuchen:
UItextField *textField = [[UITextField alloc] initWithFrame:...];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, textField.frame.size.height)];
leftView.backgroundColor = textField.backgroundColor;
textField.leftView = leftView;
textField.leftViewMode = UITextFieldViewModeAlways;
Das funktioniert bei mir. Ich hoffe, das kann helfen.
Dies ist viel einfacher als eine Unterklasse zu erstellen, nur um einen Einschub zu erhalten, und ermöglicht es Ihnen, eine beliebige Ansicht auf der linken Seite hinzuzufügen (Sie können auch rightView verwenden, um etwas auf der rechten Seite zu platzieren). Besser als die akzeptierte Antwort IMHO.
+1 einfach, keine Unterklassenbildung und für die Arbeit mit Textfeldeigenschaften konzipiert (und nicht für "Hacking").
Die dritte Zeile sollte lauten leftView.backgroundColor = textField.backgroundColor;
... Ansonsten tolle Lösung... Danke (:
In einer Klasse, die von UITextField abgeleitet ist, müssen mindestens diese beiden Methoden überschrieben werden:
- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;
So einfach kann es sein, wenn Sie keine zusätzlichen Inhalte haben:
return CGRectInset(bounds , 10, 10);
UITextField bietet mehrere Positionierungsmethoden, die Sie außer Kraft setzen können.
Ja, wenn Sie editingRectForBounds nicht überschreiben, erhalten Sie den Text beim Bearbeiten oben links im Textfeld. - (CGRect)editingRectForBounds:(CGRect)bounds { return CGRectInset(bounds, 10, 10); }
Dies scheint mir ein schrecklicher Hack - Sie müssten auch überschreiben - (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
Wie wäre es mit einem @IBInspectable
, @IBDesignable
schnelle Klasse.
@IBDesignable
class TextField: UITextField {
@IBInspectable var insetX: CGFloat = 6 {
didSet {
layoutIfNeeded()
}
}
@IBInspectable var insetY: CGFloat = 6 {
didSet {
layoutIfNeeded()
}
}
// placeholder position
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds , insetX , insetY)
}
// text position
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds , insetX , insetY)
}
}
Sie sehen dies in Ihrem Storyboard.
Aktualisierung - Swift 3
@IBDesignable
class TextField: UITextField {
@IBInspectable var insetX: CGFloat = 0
@IBInspectable var insetY: CGFloat = 0
// placeholder position
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: insetX, dy: insetY)
}
// text position
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: insetX, dy: insetY)
}
}
Ich fand den Effekt auf Y unerwünscht, ich möchte das Rect für den Text nicht schrumpfen, sondern es nach unten zur Grundlinie des Feldes schieben. Ich habe die Implementierungen angepasst, um let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
Und fügen Sie auch dies hinzu, wenn Sie Platzhalter verwenden ` override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds , insetX , insetY) }`
Seltsamerweise ist dies (das Setzen der Einsätze in textRect
/ editingRect
) beeinträchtigt die Bildlaufleistung (zumindest unter iOS 12), wenn der Text das sichtbare Rect überschreitet. Bei einem Inset von 15 wird der Bildlauf sogar gestoppt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
stackoverflow.com/questions/7565645/