ios - with - uitableview search bar programmatically swift




Personalização do iOS 11 do UISearchController (6)

Eu usava o seguinte código antes do iOS 11 para personalizar a aparência da barra de pesquisa do 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
    }
}

No entanto, atualizando para o iOS 11 e adicionando o UISearchController como parte do UISearchController de navigationItem qualquer personalização (exceto a aparência do teclado que comprova que meu código foi chamado) falha em ser exibida. Isso é um bug ou eu o implementei incorretamente?

EDIT: em anexo estão duas capturas de tela de dispositivos com iOS 10 (primeiro) e iOS 11

EDIT 2: Grande parte da atenção dada a essa questão até agora se concentra na cor do texto da UISearchBar . Estou analisando mais do que isso - a cor de plano de fundo, a cor da tonalidade, o indicador de pesquisa e as cores dos botões claros etc. não podem ser personalizadas em um dispositivo executando o iOS 11, apesar de serem perfeitamente capazes de fazê-lo no iOS 10.


Acabei de descobrir como configurá-los: (com alguma ajuda de Brandon e Krunal, obrigado!)

O texto "Cancelar":

searchController.searchBar.tintColor = .white

O ícone de pesquisa:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.search, state: .normal)

O ícone claro:

searchController.searchBar.setImage(UIImage(named: "my_search_icon"), for: UISearchBarIcon.clear, state: .normal)

O texto da pesquisa:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]

O espaço reservado:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])

O fundo branco:

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
}

Tomado here .


Experimente: searchController.<YOUR SEARCHBAR>.barStyle = .blackOpaque vez de self.searchBarStyle = .minimal .

Portanto:

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

Para definir corretamente o texto digitado na barra de pesquisa para uso em branco (ao usar uma cor de campo escura):

searchController.searchBar.barStyle = .black

Para definir a cor de fundo do campo de texto

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;
            }
        }
    }

No entanto, usando algo como

textfield.textColor = UIColor.blue

acima não parece funcionar.


Se você precisar alterar a cor de plano de fundo do campo de texto na barra de pesquisa, consulte minha resposta aqui: https://.com/a/46315974/1109892


Você precisa acessar o UITextField dentro do UISearchBar. Você pode fazer isso usando

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
    }
}

OU


Você precisa encontrar o UITextField subjacente do UITextField e alterar sua cor do texto.

Observe que isso só terá efeito quando o controlador de pesquisa for apresentado ( UISearchControllerDelegate.willPresentSearchController ) ou apresentado.

searchController.searchBar.barStyle = UIBarStyleBlack;




ios11