20

次のような drawPlaceholderInRect: メソッドをオーバーライドして UITextField の placeHolder テキストの色を変更する方法を示すいくつかの回答を見てきました。

iPhone UITextField - プレースホルダーのテキストの色を変更する

しかし、それは配置、フォントなどの既存の属性を維持しません...これを解決するより良い方法は何ですか?

4

5 に答える 5

22

これを実現するには、複数の方法があります。

Interface Builder または Storyboard の使用

  • プレースホルダーの色を変更するテキストフィールドを選択します
  • Xcodeの右上にあるIdentity inspectorメニューに移動します
  • この方法でキーと値のペアを追加します

キー パス=_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]];
}
于 2016-02-25T12:51:19.687 に答える
15

現在、これを処理するためのはるかに優れた方法が実際にあります。これは、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:] を呼び出してください。

于 2013-09-03T05:18:50.777 に答える
3

のプレースホルダーをカスタマイズする安全な方法は、 をUITextFieldサブクラス化し、UITextFieldをオーバーライドplaceholderRectForBounds:することです。Apple はこれについては気にしません。ただし、リスクを冒したい場合は、次の方法を試すことができます。

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

ソース

于 2013-09-03T05:35:13.373 に答える