it-swarm.com.de

Einrücken des Textes in einem UITextField

Meine Frage ist so einfach wie der Titel, aber hier ist noch etwas mehr:

Ich habe ein UITextField, auf das ich das Hintergrundbild gesetzt habe. Das Problem ist, dass der Text so nah an seinem Rand liegt, der auch der Rand des Bildes ist. Ich möchte, dass mein Textfeld wie das von Apple aussieht, mit etwas horizontalem Abstand zwischen dem Hintergrundbild und dem Beginn des Textes.

74
Dyldo42

Dies ist der schnellste Weg, den ich ohne Unterklassen gefunden habe:

UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
[textfield setLeftViewMode:UITextFieldViewModeAlways];
[textfield setLeftView:spacerView];

In Swift:

let spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10))
textField.leftViewMode = UITextFieldViewMode.Always
textField.leftView = spacerView
226
adjwilli

Sie müssen textRectForBounds: und editierenRectForBounds: subclass und überschreiben. Hier ist eine UITextfield-Unterklasse mit benutzerdefiniertem Hintergrund und vertikaler und horizontaler Auffüllung:

@interface MyUITextField : UITextField 
@property (nonatomic, assign) float verticalPadding;
@property (nonatomic, assign) float horizontalPadding;
@end

#import "MyUITextField.h"
@implementation MyUITextField
@synthesize horizontalPadding, verticalPadding;
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.Origin.x + horizontalPadding, bounds.Origin.y + verticalPadding, bounds.size.width - horizontalPadding*2, bounds.size.height - verticalPadding*2);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
@end

Verwendungszweck:

UIImage *bg = [UIImage imageNamed:@"textfield.png"];
CGRect rect = CGRectMake(0, 0, bg.size.width, bg.size.height);
MyUITextField *textfield = [[[MyUITextField alloc] initWithFrame:rect] autorelease];
textfield.verticalPadding = 10; 
textfield.horizontalPadding = 10;
[textfield setBackground:bg];
[textfield setBorderStyle:UITextBorderStyleNone];
[self.view addSubview:textfield];
41
Jano

Ein guter Ansatz, um UITextField mit Füllzeichen zu versehen, ist das Unterklassen von UITextField, das Überschreiben der Rechteckmethoden und das Hinzufügen einer edgeInsets-Eigenschaft. Sie können dann die edgeInsets festlegen und das UITextField wird entsprechend gezeichnet. Dies funktioniert auch mit einem benutzerdefinierten LeftView- oder RightView-Set.

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 = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    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
26
Brody Robertson

Ich habe daraus eine kleine Erweiterung für Storyboards gemacht:

public extension UITextField {
    @IBInspectable public var leftSpacer:CGFloat {
        get {
            if let l = leftView {
                return l.frame.size.width
            } else {
                return 0
            }
        } set {
            leftViewMode = .Always
            leftView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
        }
    }
}
11
Oxcug

Meine 2 Cent:

class PaddedTextField : UITextField {
    var insets = UIEdgeInsets.zero
    var verticalPadding:CGFloat = 0
    var horizontalPadding:CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.Origin.x + insets.left, y: bounds.Origin.y + insets.top, width: bounds.size.width - (insets.left + insets.right), height: bounds.size.height - (insets.top + insets.bottom));
    }

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

Ich empfehle Ihnen, Ihre UITextField in eine UITextView umzuwandeln und die contentInset einzustellen. Zum Beispiel um 10 Leerzeichen einrücken:

textview.contentInset=UIEdgeInsetsMake(0, 10, 0, 0);
1
user790072

Wenn Sie nicht @ IBOutlets erstellen möchten, können Sie einfach eine Unterklasse (Antwort in Swift) erstellen:

class PaddedTextField: UITextField {

  override func awakeFromNib() {
      super.awakeFromNib()

      let spacerView = UIView(frame:CGRect(x: 0, y: 0, width: 10, height: 10))
      leftViewMode = .always
      leftView = spacerView
   }
}
0
Vrutin Rathod

Manchmal ist die leftView von textField ein Vergrößerungsglasbild von Apple. Wenn ja, können Sie einen Einzug wie folgt setzen:

    UIView *leftView = textField.leftView;
    if (leftView && [leftView isKindOfClass:[UIImageView class]]) {
        leftView.contentMode = UIViewContentModeCenter;
        leftView.width = 20.0f;  //the space you want indented.
    }
0
Lirik