Meine Frage ist so einfach wie der Titel, aber hier ist ein bisschen mehr:
Ich habe ein UITextField, auf dem ich das Hintergrundbild festgelegt habe. Das Problem ist, dass sich der Text so eng an den Rand schmiegt, 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.
iphone
objective-c
ios
cocoa-touch
uitextfield
Dyldo42
quelle
quelle
Antworten:
Dies ist der schnellste Weg, den ich gefunden habe, ohne Unterklassen zu erstellen:
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
quelle
var spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10)); textfield.leftViewMode = UITextFieldViewMode.Always textfield.leftView = spacerView
viewDidLoad()
. Es funktioniert auch nichtviewWillAppear()
.Sie müssen textRectForBounds: und editRectForBounds: unterordnen 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
Verwendung:
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];
quelle
Ein guter Ansatz zum Hinzufügen von Auffüllungen zu UITextField besteht darin, UITextField in Unterklassen zu unterteilen, die Rechteckmethoden zu überschreiben und eine edgeInsets-Eigenschaft hinzuzufügen. Sie können dann die edgeInsets festlegen und das UITextField wird entsprechend gezeichnet. Dies funktioniert auch mit einem benutzerdefinierten leftView- oder rightView-Set ordnungsgemäß.
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
quelle
UIEdgeInsets
ist definitiv das passende Werkzeug für die jeweilige Aufgabe!Ich habe daraus eine nette kleine Erweiterung für Storyboards gemacht:
public extension UITextField { @IBInspectable public var leftSpacer:CGFloat { get { return leftView?.frame.size.width ?? 0 } set { leftViewMode = .Always leftView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height)) } } }
quelle
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) } }
quelle
Ich schlage vor, Ihre
UITextField
in a umzuwandelnUITextView
und die einzustellencontentInset
. Zum Beispiel um 10 Leerzeichen einrücken:textview.contentInset=UIEdgeInsetsMake(0, 10, 0, 0);
quelle
Manchmal ist die linke Ansicht des Textfelds das Lupenbild eines Apple. In diesem Fall können Sie einen Einzug wie folgt festlegen:
UIView *leftView = textField.leftView; if (leftView && [leftView isKindOfClass:[UIImageView class]]) { leftView.contentMode = UIViewContentModeCenter; leftView.width = 20.0f; //the space you want indented. }
quelle
Wenn Sie @ IBOutlet's nicht erstellen möchten, können Sie einfach eine Unterklasse erstellen (Antwort in Swift):
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 } }
quelle