ios cocoa-touch uitextfield alignment leftalign

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