2010-01-03 13 views

Odpowiedz

26

Równie dobrze można użyć metod UITextFieldDelegate (IMHO, łatwiejsze w utrzymaniu niż obserwatorów klucz-wartość):

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

Działa to tylko wtedy, gdy właściwość UITextField.borderStyle jest dowolnego typu, ale UITextBorderStyleRoundedRect (w takim przypadku właściwość tła nie jest brana pod uwagę). Oznacza to, można użyć kodu powyżej UITextBorderStyleBezel, UITextBorderStyleLine i UITextBorderStyleNone, jak wyjaśniono w dokumentacji BorderStyle:

BorderStyle

Styl obramowania używany przez pola tekstowego.

@property (nonatomic) UITextBorderStyle BorderStyle

Dyskusja

Domyślna wartość tej właściwości jest UITextBorderStyleNone. Jeśli ustawiony jest niestandardowy obraz tła , ta właściwość jest ignorowana.

Jest to dokumentacja dla właściwości tła UITextField:

tło

Obraz, który przedstawia wygląd tła pola tekstowego gdy jest on włączony.

@property (nonatomic, zachowują) UIImage * tło

Dyskusja

Kiedy zestaw, obraz, o którym mowa przez ta właściwość zastępuje standardowy wygląd kontrolowane przez właściwość BorderStyle. Obrazy tła są rysowane na granicy prostokątna część obrazu. Obrazy używane na potrzeby pola tekstowego powinny być w stanie rozciągnąć , aby pasowały.

+0

dzięki za wzmianka o borderStyle. To powinno być wspomniane w dokumentacji dla właściwości tła UITextField – DonnaLea

+0

Znalazłem błąd w tekście. jeśli UITextField ma zaokrąglone kąty, to ignoruje wszystkie obrazy tła. Nie vice versa – Gargo

0

Prawdopodobnie można spróbować obserwacji zmian do isFirstResponder. i zmiana tła w metodzie powiadamiania. Coś jak:

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

następnie w obserwatora:

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

Wiem, jak sprawdzić, kiedy staje się firstResponder, ale jak faktycznie zmienić obraz tła? –

+0

można zmienić zawartość warstwy textField na CGImage textField.layer.contents = myImage.CGImage; powinien działać. – Elfred

26

najczystszy sposób IMHO jest do podklasy UITextField i zastąpić becomeFirstResponder i resignFirstResponder aby zmienić obraz tła pola tekstowego. W ten sposób możesz użyć swojej nowej podklasy w dowolnym miejscu bez konieczności ponownego wdrażania metod delegatów w celu zmiany tła.

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

Bardzo sprytnie, dziękuję – Dvole

+0

Najczystsze jest subiektywne, zwolennicy kompozycji mają inny smak najczystszego rozwiązania. –