50

のテキストの色を変更するにUISearchBariOS 7?

では、 のサブビューのプロパティをカスタマイズする際にとiOS 6をサブクラス化していました。UISearchBarlayoutSubviewsUITextFieldUISearchBar

しかし ではiOS 7、そのサブビューとしてUISearchBar持っていません。UITextFieldこれを修正する方法は?

4

16 に答える 16

101

iOS 7 で Text Field にアクセスするには、さらにレベルを繰り返す必要があります。このようにコードを変更します

for (UIView *subView in self.searchBar.subviews)
{
    for (UIView *secondLevelSubview in subView.subviews){
        if ([secondLevelSubview isKindOfClass:[UITextField class]])
        {
            UITextField *searchBarTextField = (UITextField *)secondLevelSubview;

            //set font color here
            searchBarTextField.textColor = [UIColor blackColor];

            break;
        }
    }
}

注:これはパブリック API ではありません

また

UIControlsのappearanceプロパティを使用できます

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];

注: Appearance プロキシは、iOS 9.0 以降の OutPut に使用できます。

ここに画像の説明を入力

tintcolorの主要な要素に適用するようにThe を設定できますsearch bar

tintColor前景要素に色を付けるために使用します。

barTintColorバーの背景に色を付けるために使用します。

iOS v7.0 では、UIView のすべてのサブクラスは、基本クラスから tintColor の動作を派生させます。詳細については、UIView レベルでの tintColor の説明を参照してください。 アップルドキュメント

于 2013-09-27T10:46:43.227 に答える
95

で文字色を設定できます

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor blueColor]];
于 2013-10-11T10:28:27.603 に答える
5

注意 : これはアプリの拒否につながるはずです!

KVC FTW。これは私のためにそれをしました。

UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor];
于 2014-05-12T21:32:25.150 に答える
5

UIAppearance プロトコルが「パブリック API」であることは事実ですが、UITextField がこれをサポートしていることは事実ではありません。

UITextField.h を見て文字列 "UI_APPEARANCE_SELECTOR" を探すと、この文字列のインスタンスがないことがわかります。UIButton を見ると、かなりの数が見つかります。これらはすべて、UIAppearance API によって公式にサポートされているプロパティです。UITextField が UIAppearance API でサポートされていないことはややよく知られているため、Sandeep の回答のコードが常に機能するとは限らず、実際には最善のアプローチではありません。

これは便利なリンクを含む便利な投稿です: http://forums.xamarin.com/discussion/175/uitextfield-appearance

残念ながら、正しいアプローチは面倒です。サブビュー (または iOS7 のメイン サブビューのサブビュー) を反復処理し、手動で設定します。そうしないと、信頼できない結果が得られます。ただし、UISearchBar のカテゴリを作成し、setTextColor:(UIColor*)color メソッドを追加するだけです。例:

- (void)setTextColor:(UIColor*)color
{
    for (UIView *v in self.subviews)
    {
        if([Environment isVersion7OrHigher]) //checks UIDevice#systemVersion               
        {
            for(id subview in v.subviews)
            {
                if ([subview isKindOfClass:[UITextField class]])
                {
                    ((UITextField *)subview).textColor = color;
                }
            }
        }

        else
        {
            if ([v isKindOfClass:[UITextField class]])
            {
                ((UITextField *)v).textColor = color;
            }
        }
    }
}
于 2013-11-21T17:10:08.490 に答える
4

Xamarin を使用して C# で実行された実際の例を次に示します。

SearchBar = new UISearchBar ();
foreach (var subView in SearchBar.Subviews) {
    foreach (var field in subView.Subviews) {
        if (field is UITextField) {
            UITextField textField = (UITextField)field;
            textField.TextColor = UIColor.White;
        }
    }
}

これが誰かに役立つことを願っています。

于 2014-09-04T15:12:01.007 に答える
2

私の場合、複数のオブジェクトがあり、フォントの色UISearchBarを変更する必要があります。1 つの動作を更新しますが、別の動作textFieldは更新しません。appearanceWhenContainedInUISearchBar

UISearchBar次のようにカスタムをサブクラス化して実装する-(id)initWithFrame:と、機能します。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.searchBarStyle       = UISearchBarStyleMinimal;
        self.tintColor            = [UIColor whiteColor];
        self.barTintColor         = [UIColor whiteColor];

        [[UITextField appearanceForTraitCollection:self.traitCollection whenContainedIn:[self class], nil] setDefaultTextAttributes:
         @{
           NSForegroundColorAttributeName : [UIColor whiteColor]
           }];
    }
    return self;
}

UIAppearance プロトコル リファレンスによると、

つまり、appearwhenWhenContainedIn: の包含ステートメントは、半順序として扱われます。具体的な順序付け (実際のサブビュー階層) が与えられると、UIKit は、ウィンドウから実際の階層を読み取るときに、最初に一意に一致する部分的な順序付けを選択します。

したがって、の階層内のappearanceWhenContainedIn:すべてを処理するわけではありません。そして、それはそれを示唆しています。UISearchBarUIWindow

AppearanceForTraitCollection: および AppearanceForTraitCollection:whenContainedIn: メソッドを使用して、指定された特性コレクションを持つクラスのプロキシを取得します。

于 2015-04-21T09:10:15.080 に答える
0

これは iOS8 に適したソリューションです。

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14], NSForegroundColorAttributeName:[UIColor lightGrayColor]}];

フォントも設定する必要があります。そうしないと、フォント サイズが正しくなくなります。

于 2015-03-29T15:19:58.430 に答える