42

UISearchBarをInterfaceBuilder内のビューにドロップし、そのスタイルをBlack Opaqueに変更すると、キャンセルボタンが適切に青/灰色のままになり、黒になりません。

キャンセルボタンを黒にするにはどうすればよいですか?

編集:それはこのように機能します:

// Assume a UISearchBar searchBar.
NSArray *subviews = [searchBar subviews];

// The index depends on how you configure the searchBar.
UIButton *cancelButton = [subviews objectAtIndex:3];

// Set the style to "normal" style.
[cancelButton setStyle:0];

ただし、このsetStyle:方法はプライベートフレームワークからのものであるため、これはアプリをAppleに送信するときに問題になる可能性があります。

4

11 に答える 11

118

私はこのようなものを使用して、私と一緒に働きました:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]];

キャンセルボタンの色を黒に変更しました。

iOS 9.0 の更新appearanceWhenContainedIn。このメソッドは非推奨です。appearanceWhenContainedInInstancesOfClasses代わりに次を使用してください。

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]];

そしてSwift 3では:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
于 2013-04-03T15:08:15.303 に答える
34

あなたのソリューションの問題は、コードが objectAtIndex:3 がキャンセル ボタンであると想定していることです。これにより、コンパイラの警告が生成されるだけでなく、プログラムで [キャンセル] ボタンを表示している場合 (たとえば[searchBar setShowsCancelButton:YES]、 を使用すると、アプリケーションがクラッシュする危険があります。

より簡単な解決策は、以下を使用して、ViewDidLoad() で検索バー全体のスタイルを設定することです。

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];

これは、Interface Builder で設定されたスタイルをオーバーライドしますが、[キャンセル] ボタンの色もバー全体と同じ色に変更します (残念ながら、[キャンセル] ボタンのスタイルを個別に設定することはできません.

于 2010-09-07T11:43:04.390 に答える
5

iOS 10 の場合:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
于 2017-05-08T12:33:21.883 に答える
2

次の解決策を考え出し、iOS 13.0 および iOS 12.4 でも動作しています。iOS 9.0 までの以前のバージョンで動作する必要があります。次の解決策は次の場合です。

  1. キャンセル ボタンの色 (通常状態)。
  2. キャンセル ボタンの色 (無効状態)。
  3. 検索バーのテキスト フィールドの背景色 (通常の状態)。

目標 C の場合:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor whiteColor]]; 

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateDisabled];

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitleTextAttributes:@{NSBackgroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];

上記のコードは、iOS 13 と iPhone X の UI の問題も修正しました。アプリ全体で変更を行えるように、このコードをAppDelegate.mクラスのdidFinishLaunchingWithOptions関数に含めました。

于 2020-01-07T12:33:25.443 に答える
1
let view: UIView = self.searchBar.subviews[0] as UIView
let subViewsArray = view.subviews

for subView: UIView in subViewsArray {
    if let cancelButt = subView as? UIButton{
        cancelButt.setTitleColor(UIColor.white, for: .normal)         
    }
}

これは私のために働いた

于 2016-12-31T22:24:28.367 に答える
1

私はベンジャミンの答えを取り、それを安全なルックアップと組み合わせてArray、短くても安全な機能バージョンを作成しました。

searchController.searchBar.tintColor = UIColor.whiteColor()
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])?
    .filter({$0.isKindOfClass(UITextField)})
    .map({$0.tintColor = .lightGrayColor()})

これにより、[キャンセル] ボタンが白く色付けされ、入力時のカーソルが灰色になります。そうしないと白くなり、見えなくなります。はsearchController型のオブジェクトですUISearchController。結果コントローラ内で使用したい場合は、 に置き換えてselfください。

safe:下付き文字の実装は、nkukushkin の回答です。

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
于 2015-09-10T11:28:02.220 に答える
1

検索バーをクリックし、Interface Builder からビューの下に色合いを設定します。

ここに画像の説明を入力

于 2016-10-21T09:43:36.367 に答える