Crear espacio al comienzo de un UITextField https://stackoverflow.com/questions/25367502/create-space-at-the-beginning-of-a-uitextfield
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.
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
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/… 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 doUITextField.leftView = paddingView
. así que dale a la vista de relleno el ancho deseado. 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 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
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;
}
Seguir
editado el 16 de noviembre de 2022 a las 10:22
respondido el 21 de noviembre de 2014 a las 17:13
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 laUIEdgeInsetsInsetRect
función. En lugar dereturn self.newBounds(bounds)
usted, podría usarreturn UIEdgeInsetsInsetRect(bounds, padding)
y eliminar elnewBounds
método. 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 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
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.
Seguir
editado el 23 de diciembre de 2022 a las 4:57
14.8k66 medallas de oro2626 medallas de plata127127 medallas de bronce
respondido el 16 de noviembre de 2016 a las 16:06
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. 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
70
X, Y, Z son sus valores deseados
textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
Seguir
respondido el 5 de febrero de 2016 a las 9:28
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 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
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...
Seguir
editado el 22 de marzo de 2018 a las 15:46
respondido el 19 de octubre de 2015 a las 6:08
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; 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
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
}
}
}
Seguir
editado el 13 de febrero de 2018 a las 20:17
respondido el 29 de noviembre de 2017 a las 11:59
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 depaddingLeft
apaddingLeftCustom
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
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))
Seguir
editado el 26 de marzo de 2020 a las 12:16
6,65533 medallas de oro2525 medallas de plata4343 medallas de bronce
respondido el 19 de febrero de 2020 a las 15:33
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. 27 de junio de 2021 a las 15:32
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)
Seguir
editado el 18 de enero de 2019 a las 5:07
respondido el 18 de julio de 2018 a las 13:25
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? 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 27 de abril de 2020 a las 6:45
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
Seguir
editado el 17 de marzo de 2017 a las 16:01
respondido el 10 de febrero de 2017 a las 20:01
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
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.
Seguir
editado el 2 de noviembre de 2018 a las 8:40
respondido el 28 de octubre de 2018 a las 13:57
66377 medallas de plata1717 medallas de bronce
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
}
Seguir
editado el 18 de mayo de 2019 a las 5:27
respondido el 21 de marzo de 2017 a las 11:33
15.2k22 medallas de oro9393 medallas de plata8181 medallas de bronce
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);
Seguir
editado el 25 de junio de 2019 a las 13:14
26.7k2929 medallas de oro118118 medallas de plata171171 medallas de bronce
respondido el 25 de junio de 2019 a las 13:13
34533 medallas de plata1515 medallas de bronce
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()
Seguir
respondido el 18 de agosto de 2014 a las 20:29
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
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)
Seguir
respondido el 16 de mayo de 2018 a las 20:04
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 2 oct 2019 a las 12:15
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
}
}
Seguir
respondido el 20 de julio de 2021 a las 16:38
6,76633 medallas de oro3737 medallas de plata6666 medallas de bronce
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
Seguir
respondido el 21 de abril de 2016 a las 14:36
1,65411 medalla de oro1818 medallas de plata2424 medallas de bronce
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))
}
}
Seguir
respondido el 2 de diciembre de 2018 a las 3:43
13411 medalla de plata88 medallas de bronce
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 :)
Seguir
editado el 13 de octubre de 2017 a las 13:06
26.7k2929 medallas de oro118118 medallas de plata171171 medallas de bronce
respondido el 13 de octubre de 2017 a las 13:06
7111 insignia de plata11 insignia de bronce
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)
}
Seguir
respondido el 22 de diciembre de 2016 a las 10:35
1,45444 medallas de oro2323 medallas de plata3232 medallas de bronce
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
}
}
Seguir
respondido el 13 de marzo de 2017 a las 13:32
79822 medallas de oro1313 medallas de plata2323 medallas de bronce
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
}
}
}
Seguir
respondido el 26 de mayo de 2019 a las 23:31
53244 medallas de plata1515 medallas de bronce
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)
}
}
Seguir
respondido el 20 de diciembre de 2019 a las 5:59
50522 medallas de plata1212 medallas de bronce
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
}
}
Seguir
respondido el 17 de septiembre de 2020 a las 17:28
7311 medalla de plata88 medallas de bronce
-7
Cree un espacio al comienzo de un UITextField.
en Swift 5+ y Xcode 12 .
textFieldName.setLeftPaddingPoints(CGFloat(10))
textFieldName.setRightPaddingPoints(CGFloat(10)