iphone objective-c ios cocoa-touch uitextfield

iphone - Sangrar el texto en un UITextField



uitextfielddelegate (8)

Mi pregunta es tan simple como el título, pero aquí hay un poco más:

Tengo un UITextField, en el cual configuré la imagen de fondo. El problema es que el texto se abraza tan cerca de su borde, que también es el borde de la imagen. Quiero que mi campo de texto se vea como el de Apple, con un poco de espacio horizontal entre la imagen de fondo y dónde comienza el texto.


Convertí esto en una pequeña extensión para utilizar dentro de Storyboards:

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)) } } }


En ocasiones, la vista izquierda de textField es una imagen de lupa de Apple. Si es así, puedes establecer una sangría como esta:

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


Esta es la forma más rápida que he encontrado sin hacer ninguna subclases:

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

En Swift:

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


Mis 2 centavos:

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) } }


Si no desea crear @ IBOutlet, podría simplemente crear una subclase (responder en 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 } }


Sugiero convertir su UITextField a una UITextView y configurar el contentInset . Por ejemplo, para sangrar por 10 espacios:

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


Tiene que subclase y anular textRectForBounds: y editingRectForBounds :. Aquí hay una subclase UITextfield con fondo personalizado y relleno vertical y horizontal:

@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

Uso:

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];


Un buen enfoque para agregar relleno a UITextField es la subclase UITextField, anulando los métodos rectangulares y agregando una propiedad edgeInsets. A continuación, puede configurar edgeInsets y UITextField se dibujará en consecuencia. Esto también funcionará correctamente con un conjunto personalizado leftView o rightView.

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