web-dev-qa-db-ja.com

UISearchBarキャンセルボタンの色?

UISearchBarをInterface Builder内のビューにドロップし、そのスタイルを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に送信するときに問題になる可能性があります。

41
cactus

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

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

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

pdate iOS 9.0の場合、メソッドappearanceWhenContainedInは廃止されました。代わりにappearanceWhenContainedInInstancesOfClassesを使用してください:

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

そしてSwift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black
115
Hossam Ghareeb

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

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

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

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

34
Alun

これを試して見てください:(Swift 4.1- Xcode 9.3-beta4 でコードの下でテストしました)

@IBOutlet weak var sbSearchBar: UISearchBar!

sbSearchBar.tintColor = UIColor.red
sbSearchBar.showsCancelButton = true
sbSearchBar.barTintColor = UIColor.blue
sbSearchBar.tintColor = UIColor.red

if let buttonItem = sbSearchBar.subviews.first?.subviews.last as? UIButton {
    buttonItem.setTitleColor(UIColor.yellow, for: .normal)
}

enter image description here

6
Krunal

Swift 4.2

let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)

これは私にとってはうまくいきます。ありがとう@Tim Semple

5
black_pearl

これは、更新されたバージョンです 上記のHossam Ghareebの回答 for Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self] ).tintColor = UIColor.red

ただし、UIBarButtonItemの別の場所で既に設定されている場合、これは外観をオーバーライドしません。

たとえば、私のnavbarコントローラーでは、これを変更する必要がありました。

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)

上記の解決策が機能するためにこれに:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self] ).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal)
4
Tim Semple

iOS 10の場合:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
3
MobileMon

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

enter image description here

1
Rishab

私はベンジャミンの回答を取り、それを安全な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'sです。

extension Array {
    subscript(safe index: Int) -> T? {
        return indices(self) ~= index ? self[index] : nil
    }
}
1
Michal

次の解決策を考え出して、それが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関数に含めて、変更を加えられるようにしましたアプリ全体で。

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)         
    }
}

これは私のために働いた

1
Ghadeer

Swiftで同じ動作を再現したい場合:

override func viewWillAppear(animated: Bool) {
    self.searchBar.tintColor = UIColor.whiteColor()

    let view: UIView = self.searchBar.subviews[0] as! UIView
    let subViewsArray = view.subviews

    for (subView: UIView) in subViewsArray as! [UIView] {
        println(subView)
        if subView.isKindOfClass(UITextField){
            subView.tintColor = UIColor.blueColor()
        }
    }

}
0
Benjamin