ios - Añadir margen izquierdo a UITextField
cocoa-touch alignment (8)
Quiero poner el margen izquierdo del texto de un UITextField
a 10 px. ¿Cuál es la mejor manera de hacer eso?
Como he explicado en un comentario anterior, la mejor solución en este caso es extender la clase UITextField
lugar de usar una categoría, para que pueda usarla explícitamente en los campos de texto deseados.
#import <UIKit/UIKit.h>
@interface MYTextField : UITextField
@end
@implementation MYTextField
- (CGRect)textRectForBounds:(CGRect)bounds {
int margin = 10;
CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height);
return inset;
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
int margin = 10;
CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height);
return inset;
}
@end
Una categoría está destinada a agregar nuevas funciones a una clase existente, no a reemplazar un método existente.
Esperaba ver una configuración en IB en el inspector de propiedades para ajustar este valor. Resulta que había establecido la alineación y el estilo de borde inadvertidamente a los valores que se confundían con el relleno de la izquierda.
Usted no pensaría que sería una gran cosa elegir la justificación izquierda y sin borde, pero las palabras se superponen básicamente o llegan al borde de la caja y no se ven bien.
Malo:
Bueno:
Lo arreglé para mí. Espero que esto ayude a alguien más también.
He llegado casi al anular - (CGRect)textRectForBounds:(CGRect)bounds
. ahora el problema es cuando TextField entra en modo de edición, su margen izquierdo se restablece a cero .......
@implementation UITextField(UITextFieldCatagory)
- (CGRect)textRectForBounds:(CGRect)bounds {
CGRect theRect=CGRectMake(bounds.origin.x+10, bounds.origin.y, bounds.size.width-10, bounds.size.height);
return theRect;
}
Puede hacerlo extendiendo la clase UITextField
y anulando dos métodos:
- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;
Aquí está el código:
La interfaz en MYTextField.h
@interface MYTextField : UITextField
@end
Su implementación en MYTextField.m
@implementation MYTextField
static CGFloat leftMargin = 28;
- (CGRect)textRectForBounds:(CGRect)bounds
{
bounds.origin.x += leftMargin;
return bounds;
}
- (CGRect)editingRectForBounds:(CGRect)bounds
{
bounds.origin.x += leftMargin;
return bounds;
}
@end
Puedes probar esto
TextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
TextField.textAlignment = UITextAlignmentCenter;
Para Swift 3:
Haga una salida del UITextField
, por ejemplo, usernameTextField. Luego escribe el siguiente código en viewDidLoad()
let paddingView : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
usernameTextField.leftView = paddingView
usernameTextField.leftViewMode = .always
Cambie el width: 5
a un valor mayor si se requiere más espacio.
Para Swift 4 :
Prefiero usar la clase IBDesignable
y IBInspectable
propiedades IBInspectable
para poder configurar el relleno a través de guiones gráficos de Xcode y mantenerlo reutilizable. También he actualizado el código para trabajar 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))
}
}
UITextField * textField = [[UITextField alloc]init];
[textField setDelegate:self];
[textField setFrame:CGRectMake(170,112,140,25)];
[textField setBorderStyle:UITextBorderStyleNone];
[textField setBackgroundColor:[UIColor clearColor]];
[self.View addSubview:noofChildTField];
UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)] autorelease];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
Prueba este codigo