次のような drawPlaceholderInRect: メソッドをオーバーライドして UITextField の placeHolder テキストの色を変更する方法を示すいくつかの回答を見てきました。
iPhone UITextField - プレースホルダーのテキストの色を変更する
しかし、それは配置、フォントなどの既存の属性を維持しません...これを解決するより良い方法は何ですか?
次のような drawPlaceholderInRect: メソッドをオーバーライドして UITextField の placeHolder テキストの色を変更する方法を示すいくつかの回答を見てきました。
iPhone UITextField - プレースホルダーのテキストの色を変更する
しかし、それは配置、フォントなどの既存の属性を維持しません...これを解決するより良い方法は何ですか?
これを実現するには、複数の方法があります。
Interface Builder または Storyboard の使用
キー パス=_placeholderLabel.textColor
Type をクリックし、Color 属性を選択します。
次に、値の色を選択します。
コードを使用してプレースホルダーの色を設定します。
プロセス 1:
[textField setValue:[UIColor blueColor] forKeyPath:@"_placeholderLabel.textColor"];
プロセス 2 :
drawPlaceholderInRect:(CGRect)rect メソッドをオーバーライドする
- (void) drawPlaceholderInRect:(CGRect)rect {
[[UIColor blueColor] setFill];
[[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:14]];
}
現在、これを処理するためのはるかに優れた方法が実際にあります。これは、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];
}
}
このアプローチの良いところは、placeHolder 文字列の現在の UITextField プロパティを維持するため、設定したほとんどのことを IB で作業できることです。さらに、描画する必要があるたびに行うよりもはるかに効率的です。また、残りのプロパティを維持しながら、placeHolder テキストに必要なその他のプロパティを変更することもできます。
前述のように、XIB を使用しない場合は、別の機会にこれを呼び出す必要があります。このコードを drawPlaceholderInRect: メソッドに入れる場合は、必ず最後に [super drawPlaceholderInRect:] を呼び出してください。
のプレースホルダーをカスタマイズする安全な方法は、 をUITextField
サブクラス化し、UITextField
をオーバーライドplaceholderRectForBounds:
することです。Apple はこれについては気にしません。ただし、リスクを冒したい場合は、次の方法を試すことができます。
[self.MyTextField setValue:[UIColor darkGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
ソース。