2010-01-03 5 views

Répondre

26

Vous pourriez aussi bien utiliser les méthodes de UITextFieldDelegate (à mon humble avis, plus facile à entretenir que les observateurs clé-valeur):

#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; 
} 

Cela ne fonctionne que lorsque la propriété UITextField.borderStyle est de n'importe quel type sauf UITextBorderStyleRoundedRect (dans ce cas, la propriété background n'est pas prise en compte). Cela signifie que vous pouvez utiliser le code ci-dessus avec UITextBorderStyleBezel, UITextBorderStyleLine et UITextBorderStyleNone, comme expliqué dans la documentation borderStyle:

borderStyle

Le style de bordure utilisé par le champ de texte.

@property (nonatomic) UITextBorderStyle borderStyle

Discussion

La valeur par défaut de cette propriété est UITextBorderStyleNone. Si une image d'arrière-plan personnalisée est définie, cette propriété est ignorée.

Ceci est la documentation de la propriété d'arrière-plan UITextField:

fond

L'image qui représente l'aspect de fond du texte champ lorsqu'il est activé.

@property (nonatomic, conserver) UIImage * fond

Discussion

Lorsqu'il est activé, l'image désignée par cette propriété remplace l'apparence standard contrôlée par la propriété borderStyle. Contexte images sont dessinées dans la partie rectangle de l'image. Images que vous utilisez pour l'arrière-plan du champ de texte devrait être en mesure d'étirer pour s'adapter.

+0

merci de mentionner à propos du borderStyle. Cela devrait être mentionné dans la documentation de la propriété background de UITextField – DonnaLea

+0

J'ai trouvé une erreur dans votre texte. Si UITextField a des angles arrondis, il ignore toutes les images d'arrière-plan. Pas le contraire – Gargo

0

Vous pouvez probablement observer des changements à isFirstResponder. et en changeant l'arrière-plan dans la méthode de notification. Quelque chose comme:

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

Puis, en l'observateur:

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

Je sais comment vérifier quand il devient premier répondeur, mais comment puis-je réellement changer l'image de fond? –

+0

vous pouvez modifier le contenu de la couche de textField à un CGImage textField.layer.contents = myImage.CGImage; devrait fonctionner. – Elfred

26

mon humble avis de manière la plus propre est de sous-classe UITextField et passer outre becomeFirstResponder et resignFirstResponder pour changer l'image d'arrière-plan du champ de texte. De cette façon, vous pouvez utiliser votre nouvelle sous-classe n'importe où sans avoir à réimplémenter les méthodes déléguées pour changer l'arrière-plan.

- (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

Très intelligent, merci – Dvole

+0

Le plus propre est subjectif, les partisans de la composition ont un goût différent de la solution la plus propre. –