2010-01-03 9 views

Antwort

26

Genauso gut könnte man die UITextFieldDelegate Methoden (IMHO, leichter zu pflegen als Schlüssel-Wert-Beobachter):

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

Dies funktioniert nur, wenn die UITextField.borderStyle-Eigenschaft von einem beliebigen Typ außer UITextBorderStyleRoundedRect ist (in diesem Fall wird die Hintergrundeigenschaft nicht berücksichtigt). Dies bedeutet, dass Sie den Code oben mit UITextBorderStyleBezel, UITextBorderStyleLine und UITextBorderStyleNone verwenden können, wie in der Dokumentation erklärt border:

border

Die von dem Textfeld verwendet Grenze Stil.

@property (nonatomic) UITextBorderStyle border

Diskussion

Der Standardwert für diese Eigenschaft ist UITextBorderStyleNone. Wenn ein benutzerdefiniertes Hintergrundbild festgelegt ist, wird diese Eigenschaft ignoriert.

Dies ist die Dokumentation für den Hintergrund Eigenschaft UITextField:

Hintergrund

Das Bild, das die Hintergrund Erscheinungsbild des Textes Feld darstellt, wenn er aktiviert ist.

@property (nonatomic behalten) UIImage * Hintergrund

Diskussion

Wenn gesetzt, das Bild von bezeichnet diese Eigenschaft den Standard Auftritt der Borderstyle-Eigenschaft gesteuert ersetzt. Hintergrund Bilder sind in der Grenze gezeichnet Rechteck Teil des Bildes. Bilder Sie für das Textfeld verwenden Hintergrund sollte in der Lage sein, zu dehnen.

+0

danke für die Erwähnung der BorderStyle. Dies sollte in der Dokumentation für die Hintergrundeigenschaft von UITextField – DonnaLea

+0

erwähnt werden Ich habe einen Fehler in Ihrem Text gefunden. Wenn UITextField abgerundete Winkel aufweist, ignoriert es alle Hintergrundbilder. Nicht umgekehrt – Gargo

0

Sie wahrscheinlich versuchen, für Änderungen an isFirstResponder beobachten können. und Ändern des Hintergrunds in der Benachrichtigungsmethode. Etwas wie:

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

Dann im Beobachter:

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

Ich weiß, wie man prüft, wenn es zuerstResponder wird, aber wie ändere ich tatsächlich das Hintergrundbild? –

+0

Sie können den Inhalt der Ebene des textField zu einem CGImage ändern textField.layer.contents = myImage.CGImage; sollte funktionieren. – Elfred

26

Der sauberste Weg IMHO ist UITextField Unterklasse und überschreiben becomeFirstResponder und resignFirstResponder das Hintergrundbild des Textfeldes zu ändern. Auf diese Weise können Sie Ihre neue Unterklasse überall verwenden, ohne die Delegate-Methoden zur Änderung des Hintergrunds neu implementieren zu müssen.

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

Sehr schlau, danke – Dvole

+0

Am saubersten ist subjektiv, Verfechter der Zusammensetzung haben unterschiedliche Geschmack der saubersten Lösung. –

Verwandte Themen