Establecer relleno para UITextField con UITextBorderStyleNone
Quería usar un fondo personalizado para mi UITextFields
. Esto funciona bien excepto por el hecho de que tengo que usarlo UITextBorderStyleNone
para que se vea bonito. Esto obliga al texto a pegarse a la izquierda sin ningún relleno.
¿Puedo configurar un relleno manualmente para que se vea similar UITextBorderStyleRoundedRect
excepto por usar mi imagen de fondo personalizada?
Encontré un pequeño truco para configurar el relleno izquierdo para esta situación exacta.
Básicamente, configura la propiedad leftView para que UITextField
sea una vista vacía del tamaño del relleno que desea:
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
¡Funcionó de maravilla para mí!
En Swift 3/Swift 4 , se puede hacer haciendo eso
let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always
Creé la implementación de esta categoría y la agregué al principio del .m
archivo.
@implementation UITextField (custom)
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
bounds.size.width - 20, bounds.size.height - 16);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
@end
Basado en el enlace proporcionado por Piotr Blasiak. Parecía más simple que crear una subclase completamente nueva, y también más simple que agregar el archivo UIView
. Aún así, parece que falta algo para no poder controlar el relleno dentro de un campo de texto.
Solución rápida 4:
class CustomTextField: UITextField {
struct Constants {
static let sidePadding: CGFloat = 10
static let topPadding: CGFloat = 8
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(
x: bounds.origin.x + Constants.sidePadding,
y: bounds.origin.y + Constants.topPadding,
width: bounds.size.width - Constants.sidePadding * 2,
height: bounds.size.height - Constants.topPadding * 2
)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return self.textRect(forBounds: bounds)
}
}
Una versión de Swift 3 para Xcode >6, donde puede editar el valor insertado en Interface Builder/Storyboard.
import UIKit
@IBDesignable
class FormTextField: UITextField {
@IBInspectable var inset: CGFloat = 0
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: inset, dy: inset)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
}
Editar: todavía funciona en iOS 11.3.1
En iOS 6 myTextField.leftView = paddingView;
está causando problemas
Esto resuelve el problema
myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)
Para campos de texto alineados a la derecha, utilice CATransform3DMakeTranslation(-5, 0, 0)
la mención de latenitacoder en los comentarios.