419 Stimmen

Padding für UITextField mit UITextBorderStyleNone festlegen

Ich wollte einen benutzerdefinierten Hintergrund für meine UITextFields . Das funktioniert gut, bis auf die Tatsache, dass ich die UITextBorderStyleNone damit es schön aussieht. Dadurch wird der Text gezwungen, ohne Polsterung auf der linken Seite zu bleiben.

Kann ich eine Polsterung manuell einstellen, so dass sie ähnlich aussieht wie UITextBorderStyleRoundedRect außer der Verwendung meines benutzerdefinierten Hintergrundbildes?

1voto

Kishor Kundan Punkte 3055

Die Antwort von @Evil trout ist großartig. Ich verwende diesen Ansatz nun schon seit einiger Zeit. Das Einzige, was fehlt, ist der "Umgang mit zahlreichen Textfeldern". Ich habe andere Ansätze ausprobiert, aber es scheint nicht zu funktionieren.

Die Unterklassifizierung von UITextField, nur um ein Padding hinzuzufügen, machte für mich keinen Sinn. Also habe ich über alle UITextFields iteriert, um die Füllung hinzuzufügen.

-(void) addPaddingToAllTextFields:(UIView*)view {

    for(id currentView in [view subviews]){
        if([currentView isKindOfClass:[UITextField class]]) {
            // Change value of CGRectMake to fit ur need
            [currentView setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)]];
            [currentView setLeftViewMode:UITextFieldViewModeAlways];
        }

        if([currentView respondsToSelector:@selector(subviews)]){
            [textfieldarray addObjectsFromArray:[self addPaddingToAllTextFields:currentView]];
        }
    }
}

1voto

Mongi Zaidi Punkte 1033

Die beste Lösung, die ich bis jetzt gefunden habe, ist eine Kategorie. So füge ich links und rechts eine 5-Punkte-Polsterung hinzu:

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.origin.x + 5, bounds.origin.y,
                      bounds.size.width - 10, bounds.size.height);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop

@end

Die #pragma's sind nur dazu da, die lästigen Warnungen zu entfernen

1voto

Lubakis Punkte 141

Brodys Lösung hat für mich perfekt funktioniert. Ich musste Seitenansichten zu einem Textfeld hinzufügen und zusätzliche Polsterung hinzufügen. Durch die Implementierung der benutzerdefinierten UIEdgeInsets-Eigenschaft in eine UITextField-Unterklasse konnte ich die Aufgabe lösen. Ich werde diese neue Unterklasse in allen meinen Projekten verwenden.

0voto

user1686700 Punkte 758

Eine weitere Überlegung ist, dass Sie, wenn Sie mehr als eine UITextField wo Sie Polsterungen hinzufügen, ist es, eine separate UIView für jedes Textfeld, da sie nicht gemeinsam genutzt werden können.

0voto

seenickcode Punkte 772

Ich fand es viel einfacher, eine nicht editierbare UITextView und setzen Sie die contentOffset

uiTextView.contentOffset = CGPointMake(8, 7);

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