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に送信するときに問題になる可能性があります。
私はこのようなものを使用して私と一緒に働きました:
[[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
ソリューションの問題は、コードがobjectAtIndex:3がキャンセルボタンであると想定していることです。これはコンパイラの警告を生成するだけでなく、プログラムで(たとえば、[searchBar setShowsCancelButton:YES]
を使用して)[キャンセル]ボタンを表示している場合も、アプリケーションがクラッシュする危険性があります。
より簡単な解決策は、以下を使用して、ViewDidLoad()で検索バー全体のスタイルを設定することです。
searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0];
これはInterface Builderで設定されたスタイルをオーバーライドしますが、Cancelボタンの色をバー全体と同じ色に変更します(残念ながら、Cancelボタンのスタイルを個別に設定することはできません)。
これを試して見てください:(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)
}
Swift 4.2
let appearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
appearance.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor(named: "goldColor")!], for: .normal)
これは私にとってはうまくいきます。ありがとう@Tim Semple
これは、更新されたバージョンです 上記の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)
iOS 10の場合:
UISearchBar.appearance().tintColor = UIColor.red //cancel button color
UISearchBar.appearance().barTintColor = UIColor.blue //background button color
私はベンジャミンの回答を取り、それを安全な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
}
}
次の解決策を考え出して、それがiOS 13.0とiOS 12.4でも動作し、iOS 9.0までの以前のバージョンで動作している必要があります。次の解決策は次のとおりです。
目標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関数に含めて、変更を加えられるようにしましたアプリ全体で。
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)
}
}
これは私のために働いた
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()
}
}
}