web-dev-qa-db-ja.com

UISearchBar検索フィールドの背景を変更する

UISearchBar内にUIViewが含まれていて、UIViewUITableView's tableHeaderView.に割り当てられています。UISearchBarのスタイルを設定しようとしています。こんな風に見える:

What I want

門の外では、次のようになります。

How it looks now

UISearchBarのスタイル設定方法、その検索フィールドなどに関するSOの質問と回答がたくさんあり、背景に特に注意を払うものもあります。それらの多くはUISearchBar's subviewsUISearchBarBackground(または_UISearchBarSearchFieldBackgroundView)オブジェクトを検索し、その背景色を直接設定します。ただし、これを行うためにサポートされているAPIを見つけようとしています...

setSearchFieldBackgroundImage:forState:メソッドには大きな可能性があるようですが、UIControlStateNormalを使用して1pxの白(または透明)画像を使用すると、これが得られます。

Using a transparent image for setSearchFieldBackgroundImage:forState:

これを機能させる方法について何かアイデアはありますか?誰かが私にこれに答えるSOの投稿を教えてくれれば幸いですが、私は本当にそれらすべてを読んだと思います。トンに感謝します。

13
Dave

ビュー階層をトラバースせずに、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>];
7
joneswah

ここでの問題は、setSearchFieldBackgroundImage:forState:を使用すると、画像の高さが実際に検索フィールドの高さを決定することだと思います。標準の検索フィールド(少なくともiOS 8以降)の高さは28ポイントなので、その高さの画像で目的の効果が得られるはずです。

(やや紛らわしいことに、これはまた、9部構成のストレッチ可能な画像は一般的に正しく表示されないことを意味します。したがって、白地に白だけではない外観を求める場合は、3部構成の伸縮可能な画像のみを使用する必要があります。水平方向に伸びます。)

4
robotspacer

次のコードを試してください

[[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"];
3
IKKA

IOS5.0以降

[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"YourBackground.png"]forState:UIControlStateNormal];
3
Dipak Narigara

barTintColorbackgroundImageまたは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;
}

それがうまくいくかどうか教えてください!

3
aksh1t

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;
}
2
Arpan Dixit

@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;
}
1
Boris Nikolic

他の人が示唆しているように、検索バーのサブビューをトラバースして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
        }
    }
}

これにより、必要なものが得られます。

0
Ivan

私の答え これを含むiOS5以降で安定して動作します10.ハックとKVOなしで、Apple Way

0
EvGeniy Ilyin