2010-01-03 14 views

Respuesta

26

que también podría utilizar los métodos UITextFieldDelegate (en mi humilde opinión, más fácil de mantener que los observadores clave-valor):

#pragma mark - 
#pragma mark UITextFieldDelegate methods 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    _field.background = [UIImage imageNamed:@"focus.png"]; 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    _field.background = [UIImage imageNamed:@"nofocus.png"]; 
    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

Esto solo funciona cuando la propiedad UITextField.borderStyle es de cualquier tipo excepto UITextBorderStyleRoundedRect (en ese caso, la propiedad de fondo no se tiene en cuenta). Esto significa que podría utilizar el código anterior con UITextBorderStyleBezel, UITextBorderStyleLine y UITextBorderStyleNone, como se explica en la documentación borderStyle:

borderStyle

El estilo de borde utilizado por el campo de texto.

@property (no atómica) UITextBorderStyle borderStyle

Discusión

El valor predeterminado de esta propiedad es UITextBorderStyleNone. Si se establece una imagen de fondo personalizada, esta propiedad se ignora.

Esta es la documentación de la propiedad background de UITextField:

fondo

La imagen que representa la aparición fondo del campo de texto cuando está activado.

@property (no atómica, retener) UIImage * fondo

Discusión

Cuando se establece, la imagen se hace referencia por esta propiedad sustituye a la norma aspecto controlado por la propiedad borderStyle. Las imágenes de fondo se dibujan en la parte del rectángulo del borde de la imagen. Las imágenes que utiliza para el fondo del campo de texto deben poder estirar para ajustarse.

+0

gracias por mencionar sobre borderStyle. Esto debe mencionarse en la documentación para la propiedad de fondo de UITextField – DonnaLea

+0

He encontrado un error en su texto. si UITextField tiene ángulos redondeados, ignora todas las imágenes de fondo. No al revés – Gargo

0

Probablemente puede intentar la observación de cambios en isFirstResponder. y cambiando el fondo en el método de notificación. Algo así como:

[textField addObserver:theObserver forKeyPath:@"isFirstResponder" options:0 context:nil]; 

Luego, en el observador:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if(object == textField && [keyPath isEqual:@"isFirstResponder"]) { 
     //fiddle with object here 
    } 
} 
+0

Sé cómo comprobar cuándo se convierte en firstResponder, pero ¿cómo cambio realmente la imagen de fondo? –

+0

puede cambiar el contenido de la capa de textField a CGImage textField.layer.contents = myImage.CGImage; debería funcionar. – Elfred

26

La forma más limpia en mi humilde opinión es una subclase UITextField y anular becomeFirstResponder y resignFirstResponder para cambiar la imagen de fondo del campo de texto. De esta forma, puede usar su nueva subclase en cualquier lugar sin tener que volver a implementar los métodos delegados para cambiar el fondo.

- (BOOL)becomeFirstResponder { 
    BOOL outcome = [super becomeFirstResponder]; 
    if (outcome) { 
     self.background = // selected state image; 
    } 
    return outcome; 
} 

- (BOOL)resignFirstResponder { 
    BOOL outcome = [super resignFirstResponder]; 
    if (outcome) { 
     self.background = // normal state image; 
    } 
    return outcome; 
} 
+0

Muy inteligente, gracias – Dvole

+0

Más limpio es subjetivo, los defensores de la composición tienen diferentes sabores de la solución más limpia. –

Cuestiones relacionadas