UISearchController
検索バーの外観をカスタマイズするために、iOS 11より前の次のコードを使用していました。
var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
searchController.searchResultsUpdater = self
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
extension UISearchBar {
func setDefaultSearchBar() {
self.tintColor = UIColor.blue
self.searchBarStyle = .minimal
self.backgroundImage = UIImage(color: UIColor.clear)
let searchBarTextField = self.value(forKey: "searchField") as! UITextField
searchBarTextField.textColor = UIColor.white
searchBarTextField.tintColor = UIColor.blue
searchBarTextField = .dark
}
}
ただし、iOS 11に更新し、UISearchController
をnavigationItem
anyカスタマイズの一部として追加した(キーボードの外観の証明を除く)私のコードが呼び出されています)が表示されません。これはバグですか、それとも間違って実装していますか?
EDIT:添付されているのは、iOS 10(最初)とiOS 11を実行しているデバイスの2つのスクリーンショットです
EDIT 2:これまでのところ、この質問に対する注意の多くは、UISearchBar
のテキストの色に焦点を当てています。私はこれ以上を見ています-背景色、色合い、検索インジケータ、クリアボタンの色などallはカスタマイズできませんiOS 10で完全に実行できるにもかかわらず、iOS 11を実行しているデバイスで。
私はちょうどそれらを設定する方法を見つけました:(ブランドンとクルナルの助けを借りて、ありがとう!)
「キャンセル」テキスト:
searchController.searchBar.tintColor = .white
検索アイコン:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)
明確なアイコン:
searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)
検索テキスト:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
プレースホルダー:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
白い背景:
if #available(iOS 11.0, *) {
let sc = UISearchController(searchResultsController: nil)
sc.delegate = self
let scb = sc.searchBar
scb.tintColor = UIColor.white
scb.barTintColor = UIColor.white
if let textfield = scb.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.white
// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}
if let navigationbar = self.navigationController?.navigationBar {
navigationbar.barTintColor = UIColor.blue
}
navigationItem.searchController = sc
navigationItem.hidesSearchBarWhenScrolling = false
}
here から取得。
検索バーに入力したテキストを適切に白に設定するには(暗いフィールドの色を使用する場合):
searchController.searchBar.barStyle = .black
テキストフィールドの背景色を設定するには
if #available(iOS 11.0, *) {
if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.white
// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}
}
ただし、次のようなものを使用する
textfield.textColor = UIColor.blue
上記では動作しないようです。
UISearchBar
の基になるUITextField
を見つけて、テキストの色を変更する必要があります。
これは、検索コントローラーが表示(UISearchControllerDelegate.willPresentSearchController
)または表示される場合にのみ効果があることに注意してください。
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// setup your search controller...
// set search controller's delegate
navigationItem.searchController?.delegate = self
}
}
extension ViewController : UISearchControllerDelegate {
func willPresentSearchController(_ searchController: UISearchController) {
// update text color
searchController.searchBar.textField?.textColor = .white
}
}
extension UISearchBar {
var textField: UITextField? {
for subview in subviews.first?.subviews ?? [] {
if let textField = subview as? UITextField {
return textField
}
}
return nil
}
}
setDefaultSearchBar
への呼び出しをviewDidAppear
に移動すると、これを修正する必要があります。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
試してください:searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaque
の代わりにself.searchBarStyle = .minimal
。
副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:
var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
//Add this line below
searchController.searchBar.barStyle = .blackOpaque
searchController.searchResultsUpdater = self
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
extension UISearchBar {
func setDefaultSearchBar() {
self.tintColor = UIColor.blue
//Delete this line below
self.searchBarStyle = .minimal
self.backgroundImage = UIImage(color: UIColor.clear)
let searchBarTextField = self.value(forKey: "searchField") as! UITextField
searchBarTextField.textColor = UIColor.white
searchBarTextField.tintColor = UIColor.blue
searchBarTextField = .dark
}
}
SearchBarのtextFieldの背景色を変更する必要がある場合は、ここでの私の答えを参照してください: https://stackoverflow.com/a/46315974/1109892