Crear espacio al comienzo de un UITextField

Quiero dejar un poco de espacio al comienzo de un UITextField, al igual que aquí: Agregar margen a la izquierda de UITextField

Pero no sé cómo hacer eso con Swift.

Esto es lo que estoy usando en este momento:

Swift 4

 class TextField: UITextField { let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) override open func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override open func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override open func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } } 

Swift 3:

 class TextField: UITextField { let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) override func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } } 

Nunca configuré otro relleno, pero puedes ajustarlo. Esta clase no se ocupa de la visualización correcta e izquierda en el campo de texto. Si quieres que se maneje correctamente, puedes usar algo como (ejemplo en objc y solo necesitaba la RightView:

 - (CGRect)textRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)placeholderRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)editingRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeWhileEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)adjustRectWithWidthRightView:(CGRect)bounds { CGRect paddedRect = bounds; paddedRect.size.width -= CGRectGetWidth(self.rightView.frame); return paddedRect; } 

Quería evitar la subclasificación de UITextField para lograr esto, así que pude usar una extensión de la siguiente manera:

 extension UITextField { func setLeftPaddingPoints(_ amount:CGFloat){ let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) self.leftView = paddingView self.leftViewMode = .always } func setRightPaddingPoints(_ amount:CGFloat) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) self.rightView = paddingView self.rightViewMode = .always } } 

Luego, cuando necesito configurar el relleno de un campo de texto en cualquier lugar de mi aplicación, simplemente hago lo siguiente:

  textField.setLeftPaddingPoints(10) textField.setRightPaddingPoints(10) 

¡Espero que esto ayude!

X, Y, Z son sus valores deseados

 textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z) 

Dicho margen se puede lograr configurando leftView / rightView en UITextField .

Actualizado para Swift 4

 // Create a padding view for padding on left textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height)) textField.leftViewMode = .always // Create a padding view for padding on right textField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height)) textField.rightViewMode = .always 

Acabo de agregar / colocar una UIView a la izquierda y derecha del campo de texto. Entonces ahora el tipeo comenzará después de la vista.

Gracias

Espero que esto haya ayudado …

Swift 4, Xcode 9

Me gusta la respuesta de Pheepster , pero ¿qué tal si lo hacemos todo desde la extensión, sin necesidad de código de VC o subclases?

 import UIKit @IBDesignable extension UITextField { @IBInspectable var paddingLeftCustom: CGFloat { get { return leftView!.frame.size.width } set { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height)) leftView = paddingView leftViewMode = .always } } @IBInspectable var paddingRightCustom: CGFloat { get { return rightView!.frame.size.width } set { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height)) rightView = paddingView rightViewMode = .always } } } 

Solución simple swift 3 – agregue código a viewDidLoad:

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

No es necesario un código ridículamente largo

Para crear una vista de relleno para UITextField en Swift 3

 func txtPaddingVw(txt:UITextField) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 5)) txt.leftViewMode = .always txt.leftView = paddingView } 

Subclassing UITextField es el camino a seguir. Abra un patio de juegos y agregue el siguiente código:

 class MyTextField : UITextField { var leftTextMargin : CGFloat = 0.0 override func textRectForBounds(bounds: CGRect) -> CGRect { var newBounds = bounds newBounds.origin.x += leftTextMargin return newBounds } override func editingRectForBounds(bounds: CGRect) -> CGRect { var newBounds = bounds newBounds.origin.x += leftTextMargin return newBounds } } let tf = MyTextField(frame: CGRect(x: 0, y: 0, width: 100, height: 44)) tf.text = "HELLO" tf.leftTextMargin = 25 tf.setNeedsLayout() tf.layoutIfNeeded() 

Cree UIView con el espacio de relleno requerido y agréguelo al miembro textfield.leftView y establezca el miembro textfield.leftViewMode en UITextFieldViewMode.Always

 // For example if you have textfield named title @IBOutlet weak var title: UITextField! // Create UIView let paddingView : UIView = UIView(frame: CGRectMake(0, 0, 5, 20)) //Change your required space instaed of 5. title.leftView = paddingView title.leftViewMode = UITextFieldViewMode.Always 

en Swift 4.1 y Xcode 9.4.1

Inicialmente, mi campo de texto es así.

enter image description here

Después de agregar relleno en el lado izquierdo, mi campo de texto es …

enter image description here

 //Code for left padding textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: textFieldName.frame.height)) textFieldName.leftViewMode = .always 

Así también podemos crear el lado derecho. (TextFieldName.rightViewMode = .always)

Si desea el código de tipo SharedInstance (Write one use every ware) vea el siguiente código.

 //This is my shared class import UIKit class SharedClass: NSObject { static let sharedInstance = SharedClass() //This is my padding function. func textFieldLeftPadding(textFieldName: UITextField) { // Create a padding view textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 3, height: textFieldName.frame.height)) textFieldName.leftViewMode = .always//For left side padding textFieldName.rightViewMode = .always//For right side padding } private override init() { } } 

Ahora llama a esta función así.

 //This single line is enough SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF) 

En Swift 3. Puede usar UITextField personalizado con sangría que se establece en su constructor. No necesita statement adicional en un controlador.

 class CustomTextField : UITextField { private let indentView = UIView(frame: CGRect(x: 0, y:0, width: 10, height: 10)) required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.leftView = indentView self.leftViewMode = .always } } 

Coloque este código en su viewDidLoad() :

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

Esto funciona para mi 🙂

La respuesta de ScareCrow en Swift 3

 let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5); override func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } 

Manera fácil: hacer esto extendiendo UITextField

 extension UITextField { func setPadding(left: CGFloat? = nil, right: CGFloat? = nil){ if let left = left { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: left, height: self.frame.size.height)) self.leftView = paddingView self.leftViewMode = .always } if let right = right { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: right, height: self.frame.size.height)) self.rightView = paddingView self.rightViewMode = .always } } } 

Luego puede establecer el relleno en cualquier borde de esta manera:

 textField.setPadding(left: 5, right: 5)