2010-01-03 3 views
10

Vorrei modificare l'immagine di sfondo di un UITextField quando diventa il firstResponder per mostrare all'utente che ha lo stato attivo, simile alle pseudo-classi: active o: focus in CSS.Modifica sfondo UITextField quando inizia la modifica

Suppongo che possa essere necessario farlo a livello di programmazione; quindi ogni aiuto è molto apprezzato.

-Giles

risposta

26

si potrebbe anche utilizzare i metodi UITextFieldDelegate (IMHO, più facile da gestire rispetto osservatori chiave-valore):

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

Funziona solo quando la proprietà UITextField.borderStyle è di qualsiasi tipo ma UITextBorderStyleRoundedRect (in tal caso, la proprietà background non viene presa in considerazione). Questo significa che è possibile utilizzare il codice precedente con UITextBorderStyleBezel, UITextBorderStyleLine e UITextBorderStyleNone, come spiegato nella documentazione borderStyle:

borderStyle

Lo stile del bordo utilizzato dal campo di testo.

@property (nonatomic) UITextBorderStyle borderStyle

Discussione

Il valore predefinito per questa proprietà è UITextBorderStyleNone. Se è impostata un'immagine di sfondo personalizzata , questa proprietà viene ignorata.

Questa è la documentazione per la proprietà di UITextField sfondo:

sfondo

L'immagine che rappresenta l'aspetto del campo di testo sfondo quando è abilitata.

@property (nonatomic, trattenere) UIImage * sfondo

Discussione

Quando impostato, l'immagine a cui si riferisce questa struttura sostituisce lo standard aspetto controllata dalla struttura borderStyle. Sfondo le immagini vengono disegnate nella parte del rettangolo del bordo dell'immagine. Le immagini utilizzate per lo sfondo del campo di testo devono essere in grado di allungare lo per adattarsi.

+0

grazie per aver parlato del borderStyle. Questo dovrebbe essere menzionato nella documentazione per la proprietà di sfondo di UITextField – DonnaLea

+0

Ho trovato un errore nel testo. se UITextField è con angoli arrotondati, ignora tutte le immagini di sfondo. Non viceversa – Gargo

0

Probabilmente si può provare l'osservazione per le modifiche al isFirstResponder. e cambiando lo sfondo nel metodo di notifica. Qualcosa di simile:

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

Poi nell'osservatore:

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

So come controllare quando diventa FirstResponder ma come faccio a cambiare l'immagine di sfondo? –

+0

è possibile modificare il contenuto del livello di textField su CGImage textField.layer.contents = myImage.CGImage; dovrebbe funzionare. – Elfred

26

il più pulito modo secondo me è quello di sottoclasse UITextField e sovrascrivere becomeFirstResponder e resignFirstResponder per cambiare l'immagine del campo di testo di sfondo. In questo modo, puoi utilizzare la nuova sottoclasse ovunque senza dover reimplementare i metodi delegati per modificare lo sfondo.

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

Molto intelligente, grazie – Dvole

+0

Il più pulito è soggettivo, i fautori della composizione hanno un diverso sapore della soluzione più pulita. –