Настройка UISearchController iOS 11
Я использовал следующий код до iOS 11, чтобы настроить внешний вид панели поиска UISearchController
:
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
любой настройки (за исключением того, что внешний вид клавиатуры доказывает, что мой код был вызван) не отображается. Является ли это ошибкой или я неправильно ее реализовал?
EDIT:
Прилагаются два скриншота устройств под управлением iOS 10 (первый) и iOS 11
![введите описание изображения здесь]()
![введите описание изображения здесь]()
РЕДАКТИРОВАТЬ 2: Большая часть внимания к этому вопросу до сих пор фокусируется на цвете текста UISearchBar
. Я смотрю больше, чем это: цвет фона, цвет оттенка, индикатор поиска и цвета кнопок и т.д. все не могут быть настроены на устройстве с iOS 11, несмотря на то, сделайте это в iOS 10.
Ответы
Ответ 1
Я только узнал, как их установить: (с помощью Брэндона и Круналя, спасибо!)
Текст "Отмена":
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
}
![введите описание изображения здесь]()
Взято из здесь.
Ответ 2
Перемещение вызова на setDefaultSearchBar
в viewDidAppear
должно исправить это.
Ответ 3
Попробуйте установить стиль панели поиска.
searchController.searchBar.barStyle = UIBarStyleBlack;
![image 1]()
Ответ 4
Чтобы правильно установить текст, введенный в строку поиска, в белый цвет (при использовании цвета темного поля):
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
в приведенном выше примере, похоже, не работает.
Ответ 5
Вам нужно получить доступ к UITextField внутри UISearchBar. Вы можете сделать это, используя
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
ИЛИ
![введите описание изображения здесь]()
Ответ 6
Вам нужно найти UISearchBar
лежащий в основе UITextField
и изменить его цвет текста.
Обратите внимание, что это действует только тогда, когда контроллер поиска собирается (UISearchControllerDelegate.willPresentSearchController
) или представлен.
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// setup your search controller...
// set search controller 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
}
}
Ответ 7
Если вам нужно изменить цвет фона текстового поля в searchBar, см. мой ответ здесь:
fooobar.com/questions/166509/...
Ответ 8
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSForegroundColorAttributeName: UIColor.white]