2009-12-17 13 views
9

Sto tentando di implementare la risposta a this SO question. Il problema è: -[drawTextInRect] apparentemente non viene chiamato e l'impostazione dell'ombra in -[drawRect] non rende ombreggiato il testo di UITextField.drawTextInRect su UITextField non chiamato

Un'altra cosa strana è che anche se le mie implementazioni sottoclasse di -[drawTextInRect] e -[drawRect] sono completamente vuote (nemmeno una chiamata a super), il testo del campo di testo viene disegnato.

risposta

12

Questo è un bug nella documentazione dell'API UITextField. La documentazione indica che è possibile utilizzare l'override di drawTextInRect: per personalizzare il comportamento. Questo non è il caso.

In effetti, drawTextInRect: non verrà mai chiamato su un UITextField (drawPlaceholderInRect: non verrà chiamato né tra l'altro).

Vedere anche http://discussions.apple.com/thread.jspa?threadID=1727596.

L'override del metodo su UILabel funziona comunque.

+0

: 'drawPlaceholderInRect:' è ancora chiamato. Lo uso nelle sottoclassi per modificare il carattere e il colore del testo del segnaposto. – marcshilling

-1

Se non si chiama super, il compilatore potrebbe rimuovere il metodo durante l'ottimizzazione del codice. Significa in effetti che l'implementazione di UILabel viene chiamata.


Aggiornamento: Se si utilizza un pennino per creare il campo di testo, assicurarsi di aver impostato la classe del campo di testo nel pennino alla sottoclasse personalizzata, altrimenti il ​​vostro codice personalizzato non sarà chiamato.

+0

io chiamo eccellente ad un certo punto nella mia - [drawRect]. – mrueg

+0

Basta leggere l'ultima riga e farti sapere perché non funzionerebbe a scopo di test: Un'altra cosa strana è che anche se le mie implementazioni sottoclasse di - [drawTextInRect] e - [drawRect] sono completamente vuote (nemmeno una chiamata a super), il testo del campo di testo viene disegnato. –

+0

se non si chiama super è più come sovrascrivere un metodo e fornire un'implementazione personalizzata - un metodo non modifica in alcun caso il comportamento predefinito. Non c'è motivo per il compilatore di "ottimizzare" un codice rimuovendo un'implementazione di metodi vuoti in sottoclassi per tali casi. Dichiarazione di non responsabilità: non ho votato in basso :) Correzione –

0

UITextField non risponde a un messaggio - drawTextInRect:. Il codice sulla pagina di riferimento sottoclasse uno UILabel non uno UITextField, motivo per cui non ha funzionato per te.

2

Ho notato che - [drawTextInRect] viene chiamato una volta quando UITextField perde lo stato attivo. Non quello che volevo.

4

Credo che il metodo che si sta cercando è:

- (CGRect)textRectForBounds:(CGRect)bounds 

o forse

- (CGRect)editingRectForBounds:(CGRect)bounds