2013-09-03 26 views

risposta

15

C'è davvero un modo molto migliore per gestire questo ora. Funzionerà per iOS 6 e 7.

(notare questo esempio, ho creato il codice in AwakeFromNib in quanto non cambierà i colori una volta impostato, ma se non si utilizza XIB, sarà necessario modificare il posizione in cui si inserisce questo codice, come ad esempio in drawPlaceholderInRect,)

in questo esempio, creare una sottoclasse di UITextField, ignorare awakeFromNib e quindi impostare il colore del testo segnaposto rosso:

- (void)awakeFromNib 
{ 
    if ([self.attributedPlaceholder length]) 
    { 
     // Extract attributes 
     NSDictionary * attributes = (NSMutableDictionary *)[ (NSAttributedString *)self.attributedPlaceholder attributesAtIndex:0 effectiveRange:NULL]; 

     NSMutableDictionary * newAttributes = [[NSMutableDictionary alloc] initWithDictionary:attributes]; 

     [newAttributes setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName]; 

     // Set new text with extracted attributes 
     self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:[self.attributedPlaceholder string] attributes:newAttributes]; 

    } 
} 

la cosa bella su questo approccio è che mantiene le proprietà UITextField correnti per la stringa placeHolder e quindi ti permetterà di lavorare in IB per la maggior parte di ciò che imposti. Inoltre, è molto più efficiente di fare ogni volta che devi disegnare. Consente inoltre di modificare qualsiasi altra proprietà desiderata sul testo placeHolder mantenendo il resto delle proprietà.

Come accennato in precedenza, se non si utilizza XIBs, è necessario chiamarlo in un altro momento. Se inserisci questo codice nel metodo drawPlaceholderInRect :, assicurati di chiamare [super drawPlaceholderInRect:] alla fine.

+0

È possibile utilizzare 'drawPlaceholderInRect:'. Basta aggiornare la riga a: '[[self placeholder] drawInRect: rect withFont: self.font lineBreakMode: NSLineBreakByClipping alignment: self.textAlignment];'. Questo mantiene il font e l'allineamento. – rmaddy

+0

Ciò sembrerebbe implicare che tu sappia cos'è lo LinebreakMode? Indipendentemente da ciò, si sta meglio usando la mia soluzione sopra anche se la si utilizza all'interno della chiamata drawPlaceHolderInRect. –

+0

carri armati, ha funzionato bene l'ho usato come classe di categoria invece della sottoclasse –

3

Il modo più sicuro per personalizzare segnaposto UITextField s’è sottoclasse della UITextField e prioritario placeholderRectForBounds:, Apple non fastidio su questo. Tuttavia, se si vuole correre il rischio, si può provare in questo modo:

[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; 

Source.

+0

Ciò sconfigge l'intero scopo della domanda originale, che è di controllare tutti gli attributi di testo esistenti, ma basta cambiare il colore. –

+1

Grazie, Nazik. il suo lavoro per me. –

35

Da iOS 6,

Senza alcun sottoclassi, si può ottenere questo risultato con un paio di righe di codice in questo modo:

UIColor *color = [UIColor blackColor]; 
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}]; 
+1

Questa non è una soluzione completa perché non persegue gli attributi esistenti. La risposta scelta di seguito risolve per preservare gli attributi cambiando il testo segnaposto e non cancellando alcun altro attributo. –

19

Ci sono diversi modi per raggiungere questo obiettivo.

Utilizzando Interface Builder o Storyboard

  • Selezionare la Textfield per il quale si desidera cambiare il colore segnaposto
  • andare al menu ispettore di identità in alto a destra di Xcode
  • aggiungere la coppia valore della chiave in questo modo

percorso chiave = _placeholderLabel.textColor

Fare clic su Tipo e selezionare Attributo colore.

Quindi selezionare il colore in valore.

enter image description here

impostare il colore segnaposto utilizzando il codice:

Processo 1:

[textField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"]; 

Processo 2:

Override drawPlaceholderInRect: il metodo (CGRect) rect

- (void) drawPlaceholderInRect:(CGRect)rect { 
    [[UIColor blueColor] setFill]; 
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:14]]; 
} 
+0

https://stackoverflow.com/a/21156050/1000906 ha funzionato per me –

+0

Amico, grazie mille! Ho passato qualche ora a cercare di capirlo, ma non sono stato in grado di risolverlo fino a quando non ho trovato il tuo post ... grazie! – BlueFox

Problemi correlati