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