Подтвердить что ты не робот

Настройка 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.

4b9b3361

Ответ 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]