2011-04-15 19 views

Respuesta

16

Como ya he explicado en un comentario anterior, la mejor solución en este caso es extender la clase UITextField en lugar de utilizar una categoría, por lo que puede utilizar 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 para anular un método existente.

+0

Una pregunta. ¿Cómo puedo usar esta nueva clase extendida de Storyboard o Interface Builder? Muchas gracias. – Ricardo

+1

Hola Ricardo, debes seleccionar el elemento en Storyboard o Interface Builder y editar la clase personalizada en Identity Inspector. http://grrrab.it/5rr3xy – clopez

+0

Gracias clopez, ¡funciona perfectamente ahora! :) – Ricardo

1

he llegado casi anulando - (CGRect)textRectForBounds:(CGRect)bounds. Ahora problema es cuando va en TextField al modo su izquierda reinicio margen de cero a editar .......

@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; 


} 
+0

hola necesito una solución ??? – iOSPawan

+0

¿Por qué no bounds.origin.y - 20? –

-2

Puede probar este

TextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
TextField.textAlignment = UITextAlignmentCenter; 
+0

quiero el margen izquierdo a 10 Px – iOSPawan

42

Puede hacerlo mediante la extensión de clase y UITextField imperiosas 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 
+1

Gracias funcionó para mí ... Pero tengo un problema, que lo usa para todos los campos de texto en mi aplicación. Quiero que esté en el campo de texto de controladores de vista en particular. ¿Puede usted ayúdame en eso. – Sabby

+0

Es el comportamiento esperado de las categorías, no es la solución en este caso. Debe extender UITextField y anular los mismos métodos. Entonces, use la solución @clopez. – TwiterZX

+2

En primer lugar, voté en sentido ascendente, pero luego descendí. Si agrega 10 px para el origen, debe restar _20_ px del ancho para mantener el mismo margen a la izquierda y a la derecha. Además de los métodos de anulación a través de una categoría es realmente una mala idea amigo, como ya se mencionó anteriormente. –

11
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; 

probar este código

+0

¡genial! ¡gracias! simplemente modifique CGRectMake 5 a un valor mucho mayor si necesitamos un margen más grande. –

3

Tenía la esperanza de ver un escenario en el IB en el inspector de propiedades para ajustar este valor. Resultó que había establecido el estilo de alineación y borde sin darse cuenta a los valores que se mezclaron con el relleno de la izquierda.

No creo que sería un gran problema elegir justificar a la izquierda y sin borde, pero hace que las palabras se solapen o lleguen al borde de la caja y no se vean bien.

malo:

enter image description here

bueno:

enter image description here

arreglaron hasta para mí. Espero que esto ayude a alguien más también.

+1

+1 para darse cuenta de que 'UITextBorderStyleRoundedRect' agrega un bonito margen izquierdo al TextField, mientras que' UITextBorderStyleNone' más su propio borde (ángulo recto) coloca el texto justo en el borde. – pkamb

6

Para Swift 3:

Hacer una salida de la UITextField, dicen usernameTextField. A continuación, escriba 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 

Cambiar el width: 5 a un valor mayor si se requiere más espacio.

+0

Esto es mucho mejor que crear subclases ... :) – chrisoneiota

Cuestiones relacionadas