のテキストの色を変更するにUISearchBar
はiOS 7
?
では、 のサブビューのプロパティをカスタマイズする際にとiOS 6
をサブクラス化していました。UISearchBar
layoutSubviews
UITextField
UISearchBar
しかし ではiOS 7
、そのサブビューとしてUISearchBar
持っていません。UITextField
これを修正する方法は?
のテキストの色を変更するにUISearchBar
はiOS 7
?
では、 のサブビューのプロパティをカスタマイズする際にとiOS 6
をサブクラス化していました。UISearchBar
layoutSubviews
UITextField
UISearchBar
しかし ではiOS 7
、そのサブビューとしてUISearchBar
持っていません。UITextField
これを修正する方法は?
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 の説明を参照してください。 アップルドキュメント
で文字色を設定できます
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor blueColor]];
注意 : これはアプリの拒否につながるはずです!
KVC FTW。これは私のためにそれをしました。
UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor redColor];
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;
}
}
}
}
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;
}
}
}
これが誰かに役立つことを願っています。
私の場合、複数のオブジェクトがあり、フォントの色UISearchBar
を変更する必要があります。1 つの動作を更新しますが、別の動作textField
は更新しません。appearanceWhenContainedIn
UISearchBar
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:
すべてを処理するわけではありません。そして、それはそれを示唆しています。UISearchBar
UIWindow
AppearanceForTraitCollection: および AppearanceForTraitCollection:whenContainedIn: メソッドを使用して、指定された特性コレクションを持つクラスのプロキシを取得します。
これは iOS8 に適したソリューションです。
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14], NSForegroundColorAttributeName:[UIColor lightGrayColor]}];
フォントも設定する必要があります。そうしないと、フォント サイズが正しくなくなります。