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.
fonte
2013-09-03 05:18:50
È 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
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. –
carri armati, ha funzionato bene l'ho usato come classe di categoria invece della sottoclasse –