444 Stimmen

Texteinschub für UITextField?

Ich würde gerne die Text eines UITextField .

Ist dies möglich?

1 Stimmen

30voto

Chris Nolet Punkte 8347

Wenn Sie eine freie Taste haben, wird die akzeptierte Antwort für Sie nicht funktionieren. Wir sollten uns auch davor hüten, dass Apple in Zukunft Dinge ändert, indem wir super .

Um also sicherzustellen, dass der Text die Schaltfläche "Löschen" nicht überlappt, holen wir uns den "Standardwert" von super und dann nach Bedarf anpassen.

Dieser Code fügt oben, links und unten im Textfeld einen 10-Px-Einsatz ein:

@interface InsetTextField : UITextField

@end

@implementation InsetTextField

// Placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect rect = [super textRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGRect rect = [super editingRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Clear button position
- (CGRect)clearButtonRectForBounds:(CGRect)bounds {
    CGRect rect = [super clearButtonRectForBounds:bounds];

    return CGRectOffset(rect, -5, 0);
}

@end

Hinweis: UIEdgeInsetsMake nimmt Parameter in dieser Reihenfolge entgegen: top , links , unten , rechts .

0 Stimmen

Verwendung von textRectForBounds: y editingRectForBounds: Methoden ohne clearButtonRectForBounds: unter iOS 7+ hat bei mir funktioniert.

0 Stimmen

clearButtonRectForBounds: hilft nur, den Löschknopf ein wenig nach links zu schieben. Vielleicht möchten Sie sie weglassen. Mein Textfeld hatte einen dunklen Hintergrund, und die Schaltfläche "Löschen" brauchte ein bisschen mehr Platz auf der rechten Seite.

0 Stimmen

Seltsamerweise wirkt sich dies auf die Bildlaufleistung aus (zumindest unter iOS 12), wenn der Text das sichtbare Rechteck übersteigt. Mit einem Einschub von 15 hält es sogar scrollen.

27voto

smitt04 Punkte 2970

Ich dachte, ich würde eine schnelle Lösung anbieten

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds, inset, inset) 
    }
}

Mauersegler 3+

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    // text position
    override func editingRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    override func placeholderRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset, dy: self.inset)
    }
}

2 Stimmen

Vergessen Sie nicht override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }

0 Stimmen

In Swift 3 müssen Sie die Methode 'CGRect.insetBy()' verwenden

1 Stimmen

In iOS 11 zumindest, wenn Sie überschreiben textRectForBounds ist auch der Platzhalter betroffen - durch Hinzufügen der Platzhalterüberschreibung wird der Platzhalter also um weitere 10pt verschoben. Wenn das ist, was Sie suchen, aber wenn nicht, es ist gut, bewusst zu sein.

17voto

lcl Punkte 1035

Schnell

 class TextField: UITextField {

    let inset: CGFloat = 8

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }
}

0 Stimmen

Seltsamerweise wirkt sich dies auf die Bildlaufleistung aus (zumindest unter iOS 12), wenn der Text das sichtbare Rechteck übersteigt. Mit einem Einschub von 15 hält es sogar scrollen.

14voto

Golden Punkte 153

Sie können den Texteinschub für UITextField festlegen, indem Sie die leftView.

Zum Beispiel so:

UITextField *yourTextField = [[UITextField alloc] init];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
leftView.backgroundColor = [UIColor clearColor];
yourTextField.leftViewMode = UITextFieldViewModeAlways;
yourTextField.leftView = leftView;

1 Stimmen

Wenn Sie auch die linke Ansicht für ein Symbol verwenden müssen, kann dies nicht funktionieren

0 Stimmen

@Reaper diese Methode funktioniert auch für ein Bild. Fügen Sie die gewünschte Menge an Padding zur Breite des Bildrahmens hinzu und setzen Sie contentmode auf center. imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)

0 Stimmen

Das ist viel zu umständlich. Es gibt bereits eine textRectForBounds-Methode zum Einstellen des Einrückens

14voto

LondonGuy Punkte 10149

Schnell

    // adjust place holder text
    let paddingView = UIView(frame: CGRectMake(0, 0, 10, usernameOrEmailField.frame.height))
    usernameOrEmailField.leftView = paddingView
    usernameOrEmailField.leftViewMode = UITextFieldViewMode.Always

2 Stimmen

Dies ist eine wirklich billige und einfache Abhilfe. Danke!

1 Stimmen

Erstaunlich, gute Arbeit. Es funktioniert wie ein Glücksbringer. Perfekt für mich.

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