2010-05-29 17 views
9

Por alguna razón, cuando agrego un UITextfield como una subvista de la vista de contenido de una celda de tabla, el botón borrar no se alinea con el texto escrito en el campo, y aparece un poco debajo de él. ¿Hay alguna manera de mover el texto del botón borrar para evitar que esto suceda? Gracias por cualquier ayuda,¿Cómo puedo mover el botón Borrar en un UITextField?

Respuesta

3

No he visto esto, y una captura de pantalla sería útil. Pero la respuesta rápida es que puede inspeccionar la matriz de subvistas del UITextField, buscar la subvista que contiene el botón borrar y ajustar su frame.origin.

Editar: Parece que he sido votado negativamente por esta respuesta (escrita en 2010). Este no es un método aprobado "oficialmente" porque está manipulando objetos privados, pero no es detectable por Apple. El principal riesgo es que la jerarquía de vistas podría cambiarse en algún momento.

+0

Gracias por el consejo, estoy en el camino ahora pero una vez que me detenga, lo probaré y actualizaré. – Jake

+0

Sí, solo voy a mover la subvista. – Jake

+0

No se puede acceder al código de UITextField.m. UITextField debe ser subclasificado – Luda

1

Subclase UITextField y reemplazar este método:

- (CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.origin.x - 10, bounds.origin.y, bounds.size.width, bounds.size.height); 
} 

retorno del CGRect que satisfaga sus necesidades.

+2

Esto no pondrá el botón en el borde derecho. Esto: devolverá CGRectMake (bounds.size.width/2-20, bounds.origin.y-3, bounds.size.width, bounds.size.height); – Luda

6

He subclase el UITextField y anulo la función .

.h

#import <UIKit/UIKit.h> 

@interface TVUITextFieldWithClearButton : UITextField 

@end 

.m

#import "TVUITextFieldWithClearButton.h" 

@implementation TVUITextFieldWithClearButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    self.clearButtonMode = UITextFieldViewModeWhileEditing; 
} 


- (CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.size.width/2-20 , bounds.origin.y-3, bounds.size.width, bounds.size.height); 
} 

@end 
+1

Parece que ha votado negativamente las otras respuestas. No genial. –

+7

Bajé una de las respuestas. Lo hice porque la respuesta, en mi opinión, es incorrecta. He comentado por qué creo que sí, y estaré encantado de seguir hablándote sobre eso (en el hilo relevante). Lo más importante es entender cómo se hacen las cosas bien y no qué tan genial eres. – Luda

26

Como se indica por @Luda La forma correcta es a subclase UITextField y anular - (CGRect)clearButtonRectForBounds:(CGRect)bounds. Sin embargo, los límites pasados ​​al método son los de la vista en sí y no el botón. Por lo tanto, debe llamar al super para obtener el tamaño proporcionado por el SO (para evitar la distorsión de la imagen) y luego ajustar el origen para que se ajuste a sus necesidades.

p. Ej.

- (CGRect)clearButtonRectForBounds:(CGRect)bounds { 
    CGRect originalRect = [super clearButtonRectForBounds:bounds]; 
    return CGRectOffset(originalRect, -10, 0); //shift the button 10 points to the left 
} 

de Apple docs Estado:

Discusión No debe llamar a este método directamente. Si desea coloque el botón borrar en una ubicación diferente, puede anular este método y devolver el nuevo rectángulo. Su método debe llamar a la implementación de super y modificar solo el origen del rectángulo devuelto. Cambiar el tamaño del botón borrar puede causar una distorsión innecesaria de la imagen del botón.

Cuestiones relacionadas