Crear espacio al comienzo de un UITextField

Crear espacio al comienzo de un UITextField icono-predeterminado.png?t=N4P3https://stackoverflow.com/questions/25367502/create-space-at-the-beginning-of-a-uitextfield

Pregunta

Preguntado hace 8 años, 9 meses

Modificado  hace 5 meses

Visto 188k veces

198

Quiero dejar un poco de espacio al comienzo de un UITextField, como aquí:  Agregar margen izquierdo a UITextField

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

Compartir

Mejora esta pregunta

Seguir

editado el 23 de mayo de 2017 a las 12:02

Robot de la comunidad

111 insignia de plata

preguntado el 18 de agosto de 2014 a las 16:04

Linus Geffarth

26.7k2929 medallas de oro118118 medallas de plata171171 medallas de bronce

  • bueno, no puedes subclasificar objetos rápidos en Objective-C, pero puedes hacerlo al revés... Así que supongo que solo ajustas la respuesta y la combinas con:  developer.apple.com/library/prerelease/ ios/documentación/Swift/… 

    –  Jugador Grady

     18 de agosto de 2014 a las 16:12
  • 2

    Probablemente esta no sea la mejor solución, pero podría hacer un uiview *paddingView y do  UITextField.leftView = paddingView. así que dale a la vista de relleno el ancho deseado. 

    –  ipalibohyte

     18 de agosto de 2014 a las 16:12
  • 1

    la vista de relleno sería simplemente una UIView vainilla que tiene el ancho que le gustaría 

    –  Jugador Grady

     18 de agosto de 2014 a las 16:34
  • 1

    Para Swift 5: textField.layoutMargins.left = 20 

    –  JASKIER

     13 de febrero de 2020 a las 9:41

Añadir un comentario

23 respuestas

Ordenado por:

                                              Puntaje más alto (predeterminado) Tendencia (los votos recientes cuentan más) Fecha de modificación (los más nuevos primero) Fecha de creación (los más antiguos primero)                              

339

Esto es lo que estoy usando ahora mismo:

Rápido 4.2, 5

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }
}

rápido 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)
    }
}

Rápido 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 configuro otro relleno, pero puedes modificarlo. Esta clase no se ocupa de rightView y leftView en el campo de texto. Si desea que se maneje correctamente, puede usar algo como (ejemplo en objc y solo necesitaba la vista derecha:

- (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;
}

Compartir

Mejora esta respuesta

Seguir

editado el 16 de noviembre de 2022 a las 10:22

respondido el 21 de noviembre de 2014 a las 17:13

Haagen

7,91455 medallas de oro3737 medallas de plata5252 medallas de bronce

  • ¿Por qué estás duplicando los recuadros superior e izquierdo al calcular el ancho y el alto? No debería necesitar hacer eso. Debe sumar los dos recuadros relevantes y restar el total de los límites originales. O simplemente reste ambos en secuencia. 

    –  Ceniza

     26 mayo 2015 a las 16:05 
  • 1

    @ Mr.UB Verifique qué plataforma es el dispositivo actual y cree un relleno diferente basado en eso. stackoverflow.com/questions/4567728/… . Probablemente con algo como esto 

    –  Haagenti

     14 de marzo de 2016 a las 11:48
  • Apple proporciona el equivalente del  newBounds método con la  UIEdgeInsetsInsetRect función. En lugar de  return self.newBounds(bounds) usted, podría usar  return UIEdgeInsetsInsetRect(bounds, padding) y eliminar el  newBounds método. 

    –  Móvil Dan

     11/04/2016 a las 17:31 
  • Si su campo de texto tiene varias líneas, esto hace que el texto del marcador de posición esté centrado y reemplaza textAlignment = .left y contentVerticalAlignment = .top 

    –  Wiget de código

     9 de julio de 2019 a las 20:21
  • Swift 5: campo de texto.layoutMargins.left = 20 

    –  JASKIER

     13 de febrero de 2020 a las 9:40

Mostrar 1 comentario más

281

Este es un gran caso para una extensión. Al usar una extensión, no es necesario subclasificar UITextField y la nueva funcionalidad estará disponible para cualquier UITextField en su aplicación:

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

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)

Usando extensiones Swift, la funcionalidad se agrega a UITextField directamente sin subclases.

Compartir

Mejora esta respuesta

Seguir

editado el 23 de diciembre de 2022 a las 4:57

bola de estrellas

14.8k66 medallas de oro2626 medallas de plata127127 medallas de bronce

respondido el 16 de noviembre de 2016 a las 16:06

jejeje

5,96566 medallas de oro4040 medallas de plata7373 medallas de bronce

  • 10

    Excelente solución, muy elegante. El único cambio que hice fue que los agregué a una función, así que obtengo algo como textField.setPaddingFor (izquierda: 10, derecha: 10). Ambos parámetros son opcionales, por lo tanto, si pasa nil, el relleno será 0. 

    –  Nermín Sehic

     10 dic 2016 a las 20:33
  • 5

    ¡Excelente! Pero si configura textField.clearButtonMode = .always, debe configurar solo el relleno izquierdo. El relleno derecho moverá el botón borrar a la derecha. 

    -Peter  Kreinz

     30 de diciembre de 2016 a las 14:45
  • 3

    Una observación. Es más como un relleno inicial/posterior. ¡Pero lo extraño es que responde a la alineación del texto del campo de texto! no la dirección del idioma de la aplicación. 

    Hasan

     06/10/2017 a las 23:18
  • ¿Cómo configurar en UILabel? 

    –  Inocente

     11 de marzo de 2020 a las 12:19
  • Solución favorita y elimina la necesidad de repetir el mismo código a través de cada VC 

    –  Chris

     22 de enero a las 14:08

Añadir un comentario

70

X, Y, Z son sus valores deseados

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

Compartir

Mejora esta respuesta

Seguir

respondido el 5 de febrero de 2016 a las 9:28

ak2g

1,6731515 medallas de plata2222 medallas de bronce

  • 12

    Esto no parece funcionar con textField.clearButtonMode = UITextFieldViewMode.Always: el botón borrar también se mueve hacia la derecha 

    –  Capitán Protón

     13 de septiembre de 2016 a las 17:18
  • 1

    No funciona cuando se debe mostrar el botón Borrar... el botón Borrar también se mueve. 

    –  xdev

     2 de enero de 2017 a las 2:45
  • Esta respuesta es corta pero no completa y podría fallar más tarde. @Adrian tienes un gran punto, pero este no es el camino. La razón por la que tienes que hacerlo con una subclase es para todos los casos extremos. Este código probablemente fallará antes de la solución de la subclase. Pero tiene razón en que no debe escribir código que no sea estrictamente necesario y que pueda proporcionarse mediante el uso de las bibliotecas dadas, pero tampoco debe abusar de las bibliotecas estándar. 

    –  Haagenti

     9 de junio de 2017 a las 10:43 

Añadir un comentario

sesenta y cinco

Dicho margen se puede lograr configurando  leftView /  rightView a  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 un  UIView lado izquierdo y derecho del campo de texto. Así que ahora la escritura comenzará después de la vista.

Gracias

Espero que esto haya ayudado...

Compartir

Mejora esta respuesta

Seguir

editado el 22 de marzo de 2018 a las 15:46

respondido el 19 de octubre de 2015 a las 6:08

en la terminación

6,49044 medallas de oro2626 medallas de plata3737 medallas de bronce

  • 2

    si alguien necesitaba en "objetivo c" aquí está el código, UIView* paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; ser. userNameTxtFldOutlet.leftView = paddingView; ser. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways; 

    voy a abrir

     12 de abril de 2016 a las 7:09 
  • 1

    Esta solución es mucho más limpia que la subclasificación mencionada anteriormente. La subclasificación debe evitarse tanto como sea posible. Sugiero la siguiente lectura  krakendev.io/blog/subclassing-can-suck-and-heres-why 

    –  Silvano

     17 junio 2020 a las 15:50
  • tenga cuidado, esto evitará que se muestre el botón clearButton (si lo está usando) 

    –  zslavman

     16 abr 2021 a las 15:43

Añadir un comentario

39

Rápido 4, Xcode 9

Me gusta  la respuesta de Pheepster , pero ¿qué tal si lo hacemos todo desde la extensión, sin requerir el código VC ni ninguna subclase?

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

Compartir

Mejora esta respuesta

Seguir

editado el 13 de febrero de 2018 a las 20:17

respondido el 29 de noviembre de 2017 a las 11:59

Teodoro Ciuraru

3,38711 medalla de oro3232 medallas de plata3939 medallas de bronce

  • sería más seguro hacerlo rightView?.frame.size.width ?? 0 

    –  Tal

     1 de diciembre de 2017 a las 18:44
  • Que podría. Yo, por mi parte, nunca llamo al captador para que no me moleste. 

    –Teodor  Ciuraru

     2 de diciembre de 2017 a las 9:08
  • 2

    Chicos, modifiqué los nombres de los métodos de  paddingLeft a  paddingLeftCustom y el otro también. Si no hubiera hecho esto, habría aparecido un error que me siguió durante dos semanas cuando estaba usando Vistas que tienen UITextView (como UISearchBar). Simplemente... no establezca los nombres predeterminados. 

    –Teodor  Ciuraru

     13 de febrero de 2018 a las 20:20

Añadir un comentario

31

Usar mi extensión Swift 5 probada:

extension UITextField {

enum PaddingSpace {
    case left(CGFloat)
    case right(CGFloat)
    case equalSpacing(CGFloat)
}

func addPadding(padding: PaddingSpace) {

    self.leftViewMode = .always
    self.layer.masksToBounds = true

    switch padding {

    case .left(let spacing):
        let leftPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        self.leftView = leftPaddingView
        self.leftViewMode = .always

    case .right(let spacing):
        let rightPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        self.rightView = rightPaddingView
        self.rightViewMode = .always

    case .equalSpacing(let spacing):
        let equalPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        // left
        self.leftView = equalPaddingView
        self.leftViewMode = .always
        // right
        self.rightView = equalPaddingView
        self.rightViewMode = .always
    }
}
}

Cómo utilizar

// equal padding
yourTextField.addPadding(padding: .equalSpacing(10)) 

// padding right 
yourTextField.addPadding(padding: .right(10))

// padding left
yourTextField.addPadding(padding: .left(10)) 

Compartir

Mejora esta respuesta

Seguir

editado el 26 de marzo de 2020 a las 12:16

Lucas

6,65533 medallas de oro2525 medallas de plata4343 medallas de bronce

respondido el 19 de febrero de 2020 a las 15:33

fabio

5,22244 medallas de oro2121 medallas de plata2424 medallas de bronce

  • @JoséRaúlToledanoR GRACIAS :) 

    –  fabio

     29 de mayo de 2020 a las 12:20
  • Elegante. Gracias. 

    –  Carlos

     11 de junio de 2020 a las 19:21
  • @Carlo Muchas gracias Carlos :) 

    –  fabio

     12 de junio de 2020 a las 7:07
  • 1

    Esta es la mejor solución. 

    –  Narasimha Nallamsetty

     27 de junio de 2021 a las 15:32

Añadir un comentario

21

en  Swift 4.2 y Xcode 10

Inicialmente, mi campo de texto es así.

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

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

De esta manera, también podemos crear el lado derecho. (textFieldName.rightViewMode = .always)

Si desea un código de tipo SharedInstance (escriba una vez y use todos los artículos), consulte el código a continuación.

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

Compartir

Mejora esta respuesta

Seguir

editado el 18 de enero de 2019 a las 5:07

respondido el 18 de julio de 2018 a las 13:25

Naresh

16.4k66 medallas de oro109109 medallas de plata112112 medallas de bronce

  • 2

    ¿No debería funcionar mejor la extensión en lugar de introducir una clase compartida para una tarea tan pequeña? 

    Monjes Sharkes

     20 de marzo de 2019 a las 8:01
  • @ Sharkes Monken, no he entendido 

    –  Naresh

     20 de marzo de 2019 a las 8:47
  • @ Sharkes Monken, ¿puedes explicármelo? Gracias. 

    –  Naresh

     20 de marzo de 2019 a las 8:48
  • 1

    Creo que significa la extensión UITextField para la función, singleton para esta función auxiliar no es buena 

    –  logan.Nguyen

     27 de abril de 2020 a las 6:45

Añadir un comentario

14

Solución simple de 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 hay necesidad de un código ridículamente largo

Compartir

Mejora esta respuesta

Seguir

editado el 17 de marzo de 2017 a las 16:01

respondido el 10 de febrero de 2017 a las 20:01

livtay

55344 medallas de plata99 medallas de bronce

  • Esto no funciona para UITextField dentro de UISearchBar. :( Necesito la solución que funcione específicamente en ese caso :( 

    –  Miki

     9 de enero de 2018 a las 14:41
  • @livtay Esto no funcionará cuando use clearButtonMode o quiera tener una vista izquierda, etc. Sin embargo, esta es una victoria rápida, pero tenga en cuenta el agujero en el que se está metiendo. 

    –  Haagenti

     16 de enero de 2018 a las 9:13

Añadir un comentario

10

Aquí está  la respuesta de Haagenti  actualizada a Swift 4.2:

class PaddedTextField: UITextField {

    func getPadding(plusExtraFor clearButtonMode: ViewMode) -> UIEdgeInsets {
        var padding = UIEdgeInsets(top: 11, left: 16, bottom: 11, right: 16)

        // Add additional padding on the right side when showing the clear button
        if self.clearButtonMode == .always || self.clearButtonMode == clearButtonMode {
            padding.right = 28
        }

        return padding
    }

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .unlessEditing)
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .unlessEditing)
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .whileEditing)
        return bounds.inset(by: padding)
    }

}

Referencia:  Actualización a Swift 4.2 .

Editar : cuenta para el botón borrar.

Compartir

Mejora esta respuesta

Seguir

editado el 2 de noviembre de 2018 a las 8:40

respondido el 28 de octubre de 2018 a las 13:57

dibujos animadosajedrez

66377 medallas de plata1717 medallas de bronce

Añadir un comentario

10

Para crear una vista de relleno para UITextField en Swift 5

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

Compartir

Mejora esta respuesta

Seguir

editado el 18 de mayo de 2019 a las 5:27

respondido el 21 de marzo de 2017 a las 11:33

Hardik Thakkar

15.2k22 medallas de oro9393 medallas de plata8181 medallas de bronce

Añadir un comentario

10

Esta línea de código me salvó:

Para Xamarin.iOS:

textField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0);

Para rápido:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

Compartir

Mejora esta respuesta

Seguir

editado el 25 de junio de 2019 a las 13:14

Linus Geffarth

26.7k2929 medallas de oro118118 medallas de plata171171 medallas de bronce

respondido el 25 de junio de 2019 a las 13:13

shanu singh

34533 medallas de plata1515 medallas de bronce

Añadir un comentario

8

Subclasificar UITextField es el camino a seguir. Abra un parque infantil 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()

Compartir

Mejora esta respuesta

Seguir

respondido el 18 de agosto de 2014 a las 20:29

eric sean conner

27111 medalla de plata22 medallas de bronce

  • Esto es casi perfecto. Probablemente tenga un marcador de posición que tenga un método similar: "placeholderRectForBounds" que también debe anular y lo que agrega como una x debe restarse del ancho; de lo contrario, no puede ver qué tipo cuando el texto va más allá de la longitud de el campo 

    –  Haagenti

     21 de noviembre de 2014 a las 17:02 
  • si la izquierda es 25, el ancho debe ser menos 50 para tener el mismo relleno 

    –  Haagenti

     21 de noviembre de 2014 a las 17:10

Añadir un comentario

7

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 configurar el relleno en cualquier borde de esta manera:

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

Compartir

Mejora esta respuesta

Seguir

respondido el 16 de mayo de 2018 a las 20:04

Musa almatri

5,51822 medallas de oro3434 medallas de plata3333 medallas de bronce

  • pruebe el mismo código pero con vistas coloreadas -izquierda- y -derecha- en iOS 13 y constrúyalo con xCode 11 .... )) se sorprenderá de cómo textView cambia sus inserciones y mueve las vistas hacia los bordes para que las vistas agregadas no sean completamente visibles 

    –  Masajista

     2 oct 2019 a las 12:15

Añadir un comentario

7

En la mayoría de los casos, puede considerar esto como un tecnicismo, pero todos los ejemplos no captan la diferencia entre  frame y  bounds correctamente. Cuando haga referencia a la altura de la vista en una subvista, use  bounds ; de ​​lo contrario, puede tener problemas una vez que se aplique alguna transformación al padre.
Vea el código actualizado a continuación (basado en la respuesta de Pheepster).

extension UITextField {

    func setLeftPadding(_ amount: CGFloat = 10) {

        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))
        self.leftView = paddingView
        self.leftViewMode = .always
    }

    func setRightPadding(_ amount: CGFloat = 10) {

        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))
        self.rightView = paddingView
        self.rightViewMode = .always
    }
}

Compartir

Mejora esta respuesta

Seguir

respondido el 20 de julio de 2021 a las 16:38

de.

6,76633 medallas de oro3737 medallas de plata6666 medallas de bronce

Añadir un comentario

6

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

Compartir

Mejora esta respuesta

Seguir

respondido el 21 de abril de 2016 a las 14:36

PAC

1,65411 medalla de oro1818 medallas de plata2424 medallas de bronce

Añadir un comentario

6

Prefiero usar  IBDesignable la clase y  IBInspectable las propiedades para permitirme configurar el relleno a través de guiones gráficos de Xcode y mantenerlo reutilizable. También actualicé el código para que funcione en Swift 4.

import Foundation
import UIKit

@IBDesignable
class PaddableTextField: UITextField {

    var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)

    @IBInspectable var left: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var right: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var top: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var bottom: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    func adjustPadding() {
         padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }
}

Compartir

Mejora esta respuesta

Seguir

respondido el 2 de diciembre de 2018 a las 3:43

molinero payne

13411 medalla de plata88 medallas de bronce

Añadir un comentario

5

Pon este código en tu  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 :)

Compartir

Mejora esta respuesta

Seguir

editado el 13 de octubre de 2017 a las 13:06

Linus Geffarth

26.7k2929 medallas de oro118118 medallas de plata171171 medallas de bronce

respondido el 13 de octubre de 2017 a las 13:06

D.Garcia

7111 insignia de plata11 insignia de bronce

Añadir un comentario

4

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

Compartir

Mejora esta respuesta

Seguir

respondido el 22 de diciembre de 2016 a las 10:35

bobespoja92

1,45444 medallas de oro2323 medallas de plata3232 medallas de bronce

Añadir un comentario

4

En Swift 3. Puede usar UITextField personalizado con sangría que se establece en su constructor. No necesita una declaración 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 
        }
}

Compartir

Mejora esta respuesta

Seguir

respondido el 13 de marzo de 2017 a las 13:32

Punto de fotones

79822 medallas de oro1313 medallas de plata2323 medallas de bronce

Añadir un comentario

2

* Extendiendo UITextField en Swift 5 *

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

}

Compartir

Mejora esta respuesta

Seguir

respondido el 26 de mayo de 2019 a las 23:31

Emil Georgiev

53244 medallas de plata1515 medallas de bronce

Añadir un comentario

1

//MARK:-  Use this class for different type of Roles

import UIKit

class HelperExtensionViewController: UIViewController {

}

//MARK:- Extension

extension UIImageView
{
    func setImageCornerRadius()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    func setImageCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }
}

extension UIButton
{
    func setButtonCornerRadiusOnly()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    func setBtnCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }


}

extension UITextField
{
    func setTextFieldCornerRadiusWithBorder()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.layer.borderColor = UIColor.darkGray.cgColor
        self.backgroundColor = UIColor.clear
        self.layer.borderWidth = 0.5
        self.clipsToBounds = true
    }

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



extension UIView
{

    func setCornerRadius()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    // OUTPUT 1
    func setViewCornerRadiusWithBorder()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.layer.borderColor = UIColor.init(red: 95.0/255.0, green: 229.0/255.0, blue: 206.0/255.0, alpha: 1.0).cgColor
        self.backgroundColor = UIColor.clear
        self.layer.borderWidth = 1.0
        self.clipsToBounds = true
    }

    func layoutSubviews(myView:UIView)
    {
        let shadowPath = UIBezierPath(rect: myView.bounds)
        myView.layer.masksToBounds = false
        myView.layer.shadowColor = UIColor.lightGray.cgColor
        myView.layer.shadowOffset = CGSize(width: -1.0, height: 2.0)
        myView.layer.shadowOpacity = 0.5
        myView.layer.shadowPath = shadowPath.cgPath
    }

    func layoutSubviews2(myView:UIView)
    {
        let shadowPath = UIBezierPath(rect: myView.bounds)
        myView.clipsToBounds = true
        myView.layer.masksToBounds = false
        myView.layer.shadowColor = UIColor.black.cgColor
        myView.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
        myView.layer.shadowOpacity = 0.2
        myView.layer.shadowPath = shadowPath.cgPath

    }

    func setViewCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }


    func dropShadow(scale: Bool = true) {
        layer.masksToBounds = false
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOpacity = 0.5
        layer.shadowOffset = CGSize(width: -1, height: 1)
        layer.shadowRadius = 1

        layer.shadowPath = UIBezierPath(rect: bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1
    }

    // OUTPUT 2
    func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
        layer.masksToBounds = false
        layer.shadowColor = color.cgColor
        layer.shadowOpacity = opacity
        layer.shadowOffset = offSet
        layer.shadowRadius = radius

        layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1
    }

    func setGradientBackground(myview:UIView) {
        let colorTop =  UIColor(red: 100.0/255.0, green: 227.0/255.0, blue: 237.0/255.0, alpha: 1.0).cgColor
        let colorBottom = UIColor(red: 141.0/255.0, green: 109.0/255.0, blue: 164.0/255.0, alpha: 1.0).cgColor

        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorTop, colorBottom]
        gradientLayer.locations = [1.0, 1.0]
        gradientLayer.frame = myview.bounds

        myview.layer.insertSublayer(gradientLayer, at:0)
    }
}

Compartir

Mejora esta respuesta

Seguir

respondido el 20 de diciembre de 2019 a las 5:59

Davender Verma

50522 medallas de plata1212 medallas de bronce

Añadir un comentario

0

Para extender la respuesta original para leftView y Swift5+

class TextField: UITextField {

let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
override open func textRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding)
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect
}
override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding)
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect;
}
override open func editingRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding);
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect;
}

func adjustRectOriginForLeftView(bounds : CGRect) -> CGRect{
    var paddedRect = bounds;
    paddedRect.origin.x += self.leftView!.frame.width
    return paddedRect
    
}

}

Compartir

Mejora esta respuesta

Seguir

respondido el 17 de septiembre de 2020 a las 17:28

Saqibdb

7311 medalla de plata88 medallas de bronce

Añadir un comentario

-7

Cree un espacio al comienzo de un UITextField.
en  Swift 5+  y  Xcode 12 .

textFieldName.setLeftPaddingPoints(CGFloat(10))  
textFieldName.setRightPaddingPoints(CGFloat(10)

Supongo que te gusta

Origin blog.csdn.net/weixin_42610770/article/details/131059053
Recomendado
Clasificación