UISearchBar
iOS 8の 内のキャンセル ボタンのテキストを「キャンセル」から「完了」に変更したいと思います。使用してUISearchController
います。iOS 6 と iOS 7 でさまざまなアプローチを試しましたが、うまくいきません。誰もこれをやったことがありますか?
14 に答える
目的 C:
[searchBar setValue:@"customString" forKey:@"_cancelButtonText"];
迅速:
searchBar.setValue("customString", forKey:"_cancelButtonText")
これはios8からios13まで私にとってはうまくいきましたが、ios7では試しませんでしたが、アプリサイクルの初期にこの行を配置することに注意してください(例:appDelegate)
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"Annuler"];
そしてios9の時点で、あなたも使うことができます
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitle:@"Annuler"];
迅速なバージョン:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Annuler"
それが役立つことを願っています;)
それを見つけた!。iOS 8 では、キャンセル ボタンはキー「cancelButton」の下にあります。UISearchBar デリゲート searchBarTextDidBeginEditing を使用して変更を加えました。
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
let uiButton = searchBar.valueForKey("cancelButton") as UIButton
uiButton.setTitle("Done", forState: UIControlState.Normal)
}
for view in (UISearchBar.subviews[0]).subviews{
if let button = view as? UIButton{
button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
button.setTitle("Cancel", forState:.Normal)
}
}
self.subviews[0]).subviews には、UISearchBarBackground、UISearchBarTextField、UINavigationButton が UIButton のサブクラスである UINavigationButton が含まれています。View を UIButton としてチェックし、そうであれば UIButton のプロパティを変更します。
UISearchController 内の UISearchBar でこれを機能させるのに問題がありました。最初にキャンセル ボタンが表示されたときはテキストは変更されませんでしたが、2 回目は変更されました。
それは@ polo987の答えを見るまでです。これが私がやったことです:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Done"
Swift4で
タイトルを変更:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitle("Done", for: .normal)
色を変える:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitleColor(UIColor.blue, for: .normal)
ミックスに titleLabel.font を追加しました...
これは私の ViewDidLoad() {
let searchFont = UIFont(name: "BrandonGrotesque-Medium", size: 12)
let textFieldSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
textFieldSearchBar.font = searchFont
let cancelButton = searchBar.valueForKey("cancelButton") as! UIButton
cancelButton.setTitle("Done", forState: .Normal)
cancelButton.titleLabel!.font = searchFont
スウィフト 4.2、4.0+
検索バーの最も一般的な要素をカスタマイズするカスタム クラス。
class SearchBar: UISearchBar {
private enum SubviewKey: String {
case searchField, clearButton, cancelButton, placeholderLabel
}
// Button/Icon images
public var clearButtonImage: UIImage?
public var resultsButtonImage: UIImage?
public var searchImage: UIImage?
// Button/Icon colors
public var searchIconColor: UIColor?
public var clearButtonColor: UIColor?
public var cancelButtonColor: UIColor?
public var capabilityButtonColor: UIColor?
// Text
public var textColor: UIColor?
public var placeholderColor: UIColor?
public var cancelTitle: String?
// Cancel button to change the appearance.
public var cancelButton: UIButton? {
guard showsCancelButton else { return nil }
return self.value(forKey: SubviewKey.cancelButton.rawValue) as? UIButton
}
override func layoutSubviews() {
super.layoutSubviews()
if let cancelColor = cancelButtonColor {
self.cancelButton?.setTitleColor(cancelColor, for: .normal)
}
if let cancelTitle = cancelTitle {
self.cancelButton?.setTitle(cancelTitle, for: .normal)
}
guard let textField = self.value(forKey: SubviewKey.searchField.rawValue) as? UITextField else { return }
if let clearButton = textField.value(forKey: SubviewKey.clearButton.rawValue) as? UIButton {
update(button: clearButton, image: clearButtonImage, color: clearButtonColor)
}
if let resultsButton = textField.rightView as? UIButton {
update(button: resultsButton, image: resultsButtonImage, color: capabilityButtonColor)
}
if let searchView = textField.leftView as? UIImageView {
searchView.image = (searchImage ?? searchView.image)?.withRenderingMode(.alwaysTemplate)
if let color = searchIconColor {
searchView.tintColor = color
}
}
if let placeholderLabel = textField.value(forKey: SubviewKey.placeholderLabel.rawValue) as? UILabel,
let color = placeholderColor {
placeholderLabel.textColor = color
}
if let textColor = textColor {
textField.textColor = textColor
}
}
private func update(button: UIButton, image: UIImage?, color: UIColor?) {
let image = (image ?? button.currentImage)?.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.setImage(image, for: .highlighted)
if let color = color {
button.tintColor = color
}
}
}
使用法:
class ViewController: UIViewController {
@IBOutlet private weak var searchBar: SearchBar!
override func viewDidLoad() {
super.viewDidLoad()
searchBar.clearButtonColor = .purple
searchBar.cancelButtonColor = .magenta
searchBar.searchIconColor = .red
searchBar.placeholderColor = .green
searchBar.textColor = .orange
searchBar.capabilityButtonColor = .green
}
}
これは少し無関係に思えるかもしれませんが、私の意見では、これはプライベート API を使用するよりも安全であり、未知のビューに飛び込むよりも効率的です。このソリューションは、独自のローカリゼーション エンジンを持っていて、アプリ全体で Apple に独自のメカニズムに従ってもらいたい場合にのみ意味があります。基本的に私の考えは、NSUserDefaults の「AppleLanguages」キーを変更して、iOS SDK がボタンをローカライズするために使用する言語を切り替えることです。この仕組みの詳細については、こちらを参照してください。
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
電話に設定されている言語に関係なく、英語のローカライズとフランス語のフォールバックを使用するには、このコードを挿入します。これはアプリ内でのみ有効です。