Ответ 1
Есть действительно лучший способ справиться с этим сейчас. Это будет работать для iOS 6 и 7.
(Обратите внимание, что в этом примере я создал код в AwakeFromNib, так как он не будет менять цвета после его установки. Но если вы не используете XIB, вам придется изменить место, где вы помещаете этот код, например, в drawPlaceholderInRect,)
В этом примере мы создаем подкласс UITextField, переопределяем awakeFromNib и затем устанавливаем цвет текста placeHolder красным:
- (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];
}
}
Самое приятное в этом подходе заключается в том, что он поддерживает текущие свойства UITextField для строки placeHolder, и поэтому позволит вам работать в IB для большей части того, что вы установили. Кроме того, он намного эффективнее, чем делать каждый раз, когда вам нужно рисовать. Он также позволяет вам изменять любое другое свойство, которое вы хотите, на текст placeHolder, сохраняя при этом остальные свойства.
Как уже упоминалось выше, если вы не используете XIB, вам нужно будет позвонить это в другое время. Если вы поместите этот код в метод drawPlaceholderInRect: затем убедитесь, что вы вызываете [super drawPlaceholderInRect:] в конце его.