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?

876voto

Evil Trout Punkte 9543

Ich habe einen netten kleinen Hack gefunden, um die linke Auffüllung für genau diese Situation einzustellen.

Im Grunde setzen Sie die Eigenschaft leftView der Datei UITextField eine leere Ansicht in der Größe der gewünschten Polsterung sein:

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

Hat bei mir wunderbar funktioniert!

Unter Mauersegler 3/ Mauersegler 4 kann man das tun

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always

184voto

Nate Flink Punkte 3834

Ich habe diese Kategorie-Implementierung erstellt und sie oben in die .m Datei.

@implementation UITextField (custom)
    - (CGRect)textRectForBounds:(CGRect)bounds {
        return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
                          bounds.size.width - 20, bounds.size.height - 16);
    }
    - (CGRect)editingRectForBounds:(CGRect)bounds {
        return [self textRectForBounds:bounds];
    }
@end

Auf der Grundlage des von Piotr Blasiak bereitgestellten Links. Es schien einfacher zu sein, als eine ganz neue Unterklasse zu erstellen, und auch einfacher als das Hinzufügen der zusätzlichen UIView . Dennoch scheint es, dass etwas fehlt, wenn man die Auffüllung eines Textfeldes nicht steuern kann.

Swift 4 Lösung:

class CustomTextField: UITextField {
    struct Constants {
        static let sidePadding: CGFloat = 10
        static let topPadding: CGFloat = 8
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(
            x: bounds.origin.x + Constants.sidePadding,
            y: bounds.origin.y + Constants.topPadding,
            width: bounds.size.width - Constants.sidePadding * 2,
            height: bounds.size.height - Constants.topPadding * 2
        )
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds: bounds)
    }
}

147voto

bandejapaisa Punkte 25645

Eine Swift 3 Version für Xcode >6, bei der Sie den Einfügewert im Interface Builder / Storyboard bearbeiten können.

import UIKit

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var inset: CGFloat = 0

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

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }

}

enter image description here

79voto

Inder Kumar Rathore Punkte 38280

Bearbeiten: Funktioniert immer noch unter iOS 11.3.1

In iOS 6 myTextField.leftView = paddingView; verursacht ein Problem

Damit ist das Problem gelöst

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

Für ein rechtsbündiges Textfeld verwenden Sie CATransform3DMakeTranslation(-5, 0, 0) wie erwähnt von latenitecoder in Kommentaren

71voto

Brody Robertson Punkte 8317

Ein guter Ansatz, um UITextField Polsterungen hinzuzufügen, ist die Unterklasse und das Hinzufügen einer edgeInsets-Eigenschaft. Sie setzen dann die edgeInsets und das UITextField wird entsprechend gezeichnet. Dies funktioniert auch korrekt mit einem benutzerdefinierten leftView oder rightView Satz.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

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