UISearchBar
内にUIView
が含まれていて、UIView
がUITableView's tableHeaderView.
に割り当てられています。UISearchBar
のスタイルを設定しようとしています。こんな風に見える:
門の外では、次のようになります。
UISearchBar
のスタイル設定方法、その検索フィールドなどに関するSOの質問と回答がたくさんあり、背景に特に注意を払うものもあります。それらの多くはUISearchBar's subviews
、UISearchBarBackground
(または_UISearchBarSearchFieldBackgroundView
)オブジェクトを検索し、その背景色を直接設定します。ただし、これを行うためにサポートされているAPIを見つけようとしています...
setSearchFieldBackgroundImage:forState:
メソッドには大きな可能性があるようですが、UIControlStateNormal
を使用して1pxの白(または透明)画像を使用すると、これが得られます。
これを機能させる方法について何かアイデアはありますか?誰かが私にこれに答えるSOの投稿を教えてくれれば幸いですが、私は本当にそれらすべてを読んだと思います。トンに感謝します。
ビュー階層をトラバースせずに、appearanceWhenContainedInを使用して要素をターゲットにできます。何かのようなもの:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor whiteColor]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor lightGrayColor]];
更新:
appearanceWhenContainedIn
は非推奨になりましたので、
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar self]]] <your setter here>];
ここでの問題は、setSearchFieldBackgroundImage:forState:
を使用すると、画像の高さが実際に検索フィールドの高さを決定することだと思います。標準の検索フィールド(少なくともiOS 8以降)の高さは28ポイントなので、その高さの画像で目的の効果が得られるはずです。
(やや紛らわしいことに、これはまた、9部構成のストレッチ可能な画像は一般的に正しく表示されないことを意味します。したがって、白地に白だけではない外観を求める場合は、3部構成の伸縮可能な画像のみを使用する必要があります。水平方向に伸びます。)
次のコードを試してください
[[UISearchBar appearance]setBackgroundImage:[UIImage imageNamed:@“searchbar_bg.png"]];
for (UIView *searchbuttons in searchBar.subviews) {
if ([searchbuttons isKindOfClass:[UIButton class]]) {
UIButton *cancelbutton = (UIButton *)searchbuttons;
[cancelbutton setBackgroundImage:[UIImage imageNamed:@“canelBtn.png"] forState:UIControlStateNormal];
}
}
UITextField *searchField = [searchBar valueForKey:@"_searchField"];
searchField.background = [UIImage imageNamed:@"bg.png"];
IOS5.0以降
[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"YourBackground.png"]forState:UIControlStateNormal];
barTintColor
のbackgroundImage
またはUISearchBar
プロパティのいずれかを使用して、実行しようとしていることを直接実行できます。
私はあなたの問題を再現しました、そしてそれは以下によって解決されるようです:
self.searchDisplayController.searchBar.barTintColor = [UIColor whiteColor];
または
self.searchDisplayController.searchBar.backgroundImage = [self imageWithColor:[UIColor whiteColor]];
P.S. backgroundImageソリューションを使用している場合は、次のようにメソッドimageWithColor
を作成する必要があります。
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
それがうまくいくかどうか教えてください!
iO9パーフェクトな作品。
- (void)viewDidLoad
{
[super viewDidLoad];
[[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor: [UIColor redColor]];
}
- (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view
{
if ([view isKindOfClass:[UITextField class]]) {
return (UITextField*)view;
}
UITextField *searchedTextField;
for (UIView *subview in view.subviews) {
searchedTextField = [self searchSubviewsForTextFieldIn:subview];
if (searchedTextField) {
break;
}
}
return searchedTextField;
}
@joneswahの回答はiOS9では非推奨です。
IOS 9の場合、これをAppDelegate.mに配置します。また、キーボードを初めて起動するときのキーボードの開始ラグの回避策を追加しました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Remove lag on oppening the keyboard for the first time when clicked on any UITextField
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
//searchBar background color change
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];//background color
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];//text color
return YES;
}
他の人が示唆しているように、検索バーのサブビューをトラバースしてUITextFieldインスタンスを見つける必要があります。ただし、backgroundColorプロパティを設定しても効果がないため、layer.backgroundColorを設定する必要があります。例を挙げましょう:
for view in searchBar.subviews {
for subview in view.subviews {
if let searchField = subview as? UITextField {
searchField.layer.backgroundColor = UIColor.whiteColor().CGColor
}
}
}
これにより、必要なものが得られます。
私の答え これを含むiOS5以降で安定して動作します10.ハックとKVOなしで、Apple Way