444 Stimmen

Texteinschub für UITextField?

Ich würde gerne die Text eines UITextField .

Ist dies möglich?

1 Stimmen

652voto

dvs Punkte 12194

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

10 Stimmen

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.

2 Stimmen

Diese Lösung verträgt sich nicht gut mit clearButton. Der Text im TextField überlagert die Schaltfläche.

0 Stimmen

Ich denke, das Überschreiben der oben genannten Methoden wird das Blättern verlangsamen, wenn UITextField befindet sich innerhalb einer UIScrollView .

303voto

chuthan20 Punkte 5337

Ich konnte es durchziehen:

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

Vergessen Sie natürlich nicht, QuartzCore zu importieren und auch das Framework zu Ihrem Projekt hinzuzufügen.

43 Stimmen

+1 für Kreativität, aber das ist ein bisschen problematisch, es verschiebt auch die Löschtaste im Textfeld

2 Stimmen

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

0 Stimmen

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.

183voto

roberto.buratti Punkte 2467

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.

18 Stimmen

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.

5 Stimmen

+1 einfach, keine Unterklassenbildung und für die Arbeit mit Textfeldeigenschaften konzipiert (und nicht für "Hacking").

0 Stimmen

Die dritte Zeile sollte lauten leftView.backgroundColor = textField.backgroundColor; ... Ansonsten tolle Lösung... Danke (:

170voto

drawnonward Punkte 52834

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.

2 Stimmen

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

1 Stimmen

Habe gerade die Antwort bearbeitet, um die Methode editingRectForBounds in

5 Stimmen

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;

107voto

mash Punkte 3746

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.

enter image description here

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

2 Stimmen

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)

1 Stimmen

Und fügen Sie auch dies hinzu, wenn Sie Platzhalter verwenden ` override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds , insetX , insetY) }`

0 Stimmen

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

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.

Powered by:

X