Como posso alterar a cor do texto de pesquisa UISearchBar?


Respostas:


108

Você tem que acessar o UITextFielddentro do UISearchBar. Você pode fazer isso usandovalueForKey("searchField")

var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

Atualização do Swift 3

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

textFieldInsideSearchBar?.textColor = yourcolor

1
Eu editei minha resposta. Você pode acessar o campo usando valueforkey ("searchField")
Christian

7
Não é uma API privada, mas é muito frágil e pode quebrar em qualquer atualização do iOS. Você nunca deve usar coisas como essas no código de produção
Lope

2
@Christian - não importa quando a resposta original foi postada, ela ainda depende de uma API privada. Se fosse público, você não precisaria acessar searchFieldvia KVC.
Greg Brown

1
Votar negativamente. Veja a resposta de @juanjo e meu comentário para uma abordagem muito mais robusta aprovada pela Apple e muito menos provável de quebrar.
RobP de

1
Não use esta resposta, você está acessando APIs privadas e seu aplicativo pode ser rejeitado.
aryaxt

64

Se você deseja definir a cor do texto para UISearchBar no storyboard (sem código), é fácil de fazer também (no inspetor de identidade). Aqui está um texto em vermelho para a barra de pesquisa.

insira a descrição da imagem aqui


2
É melhor ter menos código para elementos de visualização. Obrigado.
NRR

Solução perfeita!
Mona

49

Trabalhando em Swift 4 para mim:

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

Swift 4.2, IOS 12:

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

Trabalhando para mim.
Surjeet Rajput

e muda de cor para cada barra de pesquisa no módulo?
Zaporozhchenko Oleksandr

48

Se você só precisa torná-lo legível em um fundo escuro, pode alterar o barStyle. O seguinte deixa o texto e os botões na barra de pesquisa brancos:

searchController.searchBar.barStyle = .black

@Bacon, ajudou também! Obrigado
Goppinath

32
public extension UISearchBar {

    public func setTextColor(color: UIColor) {
        let svs = subviews.flatMap { $0.subviews }
        guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
        tf.textColor = color
    }
}

Como sua solução. Obrigado.
Bagusflyer

Você também pode adicionar "searchField.backgroundColor" para controlar a cor de fundo do campo de texto separada da tonalidade da barra.
Sherwin Zadeh de

13

Isso funciona para mim no iOS 11, Xcode 9:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

Eu escrevo no AppDelegatemas acho que funciona se você colocar em outro lugar também.


3
Essa é uma abordagem muito mais robusta do que o absurdo do valor-chave na resposta aceita e em outras respostas. No entanto, a Apple em sua sabedoria descontinuou a API que você usa aqui e oferece uma nova versão para iOS 9.0 e superior, assim: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];Este é, obviamente, Objective-C, com tradução óbvia para Swift usandoappearance(whenContainedInInstancesOf:)
RobP

2
Não parece funcionar para mim no Xcode 10, iOS 12, em um dispositivo real.
Oded de

10

Acho que a maneira mais conveniente é definir uma textColorpropriedade em UISearchBar.

Swift 3.0

    extension UISearchBar {

       var textColor:UIColor? {
           get {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   return textField.textColor
               } else {
                   return nil
               }
           }

           set (newValue) {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   textField.textColor = newValue
               }
           }
       }
   }

Uso

searchBar.textColor = UIColor.blue // Your color

Swift 2.3

extension UISearchBar {

 var textColor:UIColor? {
     get {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             return textField.textColor
         } else {
             return nil
         }
     }

     set (newValue) {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             textField.textColor = newValue
         }
     }
 }
} 

Você o usaria como:

searchBar.textColor = UIColor.blueColor() // Your color

não está funcionando para mim. quando você define a propriedade textcolor?
Kingalione

1
@Kingalione você pode definir isso em 'viewDidLoad ()'
Tal Zion

Sim, eu queria mudar a cor do texto do placholder. Agora encontrei as soluções. Obrigado mesmo assim
Kingalione

10

Desde o Xcode 11 e iOS 13, tornou-se possível acessar o campo de texto diretamente:

searchBar.searchTextField

Você pode escrever algum código para sempre torná-lo acessível assim.

extension UISearchBar {
    public var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return searchTextField
        } 

        guard let firstSubview = subviews.first else {
            assertionFailure("Could not find text field")
            return nil
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

        assertionFailure("Could not find text field")

        return nil
    }
}

Você também pode torná-lo não opcional com erros fatais, este código é testado desde iOS 7 até iOS 13GM. Mas eu escolheria apenas a versão opcional.

extension UISearchBar {
    public var textField: UITextField {
        if #available(iOS 13.0, *) {
            return searchTextField
        }

        guard let firstSubview = subviews.first else {
            fatalError("Could not find text field")
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

       fatalError("Could not find text field")
    }
}

Finalmente! Podemos acessar o campo de texto diretamente. Obrigado, Saren.
Mark Moeykens

4

Tente isto,

searchBar.searchTextField.textColor = .white

Estou usando isso com o aplicativo direcionado ao iOS 11 em diante.

[Atualização] Observei que o aplicativo trava em versões mais antigas (<iOS 13), mas o compilador nunca reclamou da verificação de versão, alguém, por favor, explique por que isso aconteceu.


3

Você pode fazer isso acessando o UITextField dentro da searchBar, então você pode alterar sua cor de fundo, cor do texto e todas as outras propriedades UITextField

adicione a seguinte extensão para acessar o textField

extension UISearchBar {
    /// Return text field inside a search bar
    var textField: UITextField? {
        let subViews = subviews.flatMap { $0.subviews }
        guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
        }
        return textField
    }
}

3

Tentei algumas das soluções escritas acima, mas não funcionaram (mais, eu acho).

Se você deseja lidar apenas com iOS 13:

mySearchBar.searchTextField.textColor = .red

Mas se você quiser lidar com iOS mais antigo também, fiz o seguinte:

Crie uma UISearchBarclasse personalizada , chamada SearchBar : UISearchBar, UISearchBarDelegate This SearchBarterá os UISearchBarDelegatemétodos que desejo tratar e seu delegateconjunto.

E acrescento à classe:

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }

Explicação curta:

Com o iOS13 agora, você pode acessar os UITextFieldagradecimentos a UISearchBar.searchTextField, que é do tipo UISearchTextField, que herda de UITextField.

Como conheço minha hierarquia, sei textFieldque não será nillpara versões mais antigas, então, em ambos os casos, recebo um campo de texto que posso personalizar facilmente, trabalhando em todas as versões, das 9 às 13 de hoje.

Aqui está o código completo necessário para fazê-lo funcionar:


class SearchBar: UISearchBar, UISearchBarDelegate {

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }


    override func awakeFromNib() {
        super.awakeFromNib()

        delegate = self

        if let textField = textField {
            textField.textColor = .red
            textField.clearButtonMode = .whileEditing
            textField.returnKeyType = .search
        }
    }

}

Você também pode definir alguma personalização SearchBaradicionando isto em:

        let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
        searchBar.backgroundImage = UIImage()
        searchBar.isTranslucent = false
        searchBar.returnKeyType = .search

Então você configura para o XIB / Storyboard e você o manuseia como se fosse um simples UISearchBar(se você não esqueceu os delegados!)


2

(Esta solução testada apenas para Xcode 10 e iOS 12.) Adicione uma extensão para acessar o campo de texto da barra de pesquisa:

extension UISearchBar {
    var textField: UITextField? {
        return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
    }
}

Em seguida, use essa propriedade para definir a cor do texto do campo de texto em sua barra de pesquisa:

let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want

// EDITAR

O código acima não funciona para iOS 13. A melhor maneira de lidar com isso é usar:

extension UISearchBar {
    var textField: UITextField? {
        return self.subviews(ofType: UITextField.self).first
    }
}

extension UIView {
    var recursiveSubviews: [UIView] {
        return self.subviews + self.subviews.flatMap { $0.recursiveSubviews }
    }

    func subviews<T: UIView>(ofType: T.Type) -> [T] {
        return self.recursiveSubviews.compactMap { $0 as? T }
    }
}

para iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras

2

// Tente esse cara

yourSearchbar.searchTextField.textColor = .white

1

Aqui está uma versão Xamarin.iOS C # da abordagem "localizar o UITextField". Não irá travar se UITextField desaparecer na futura hierarquia de visualização do iOS.

var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null) 
    (tf as UITextField).TextColor = UIColor.White;

public static IEnumerable<UIView> AllSubViews(this UIView view)
{
    foreach (var v in view.Subviews)
    {
        yield return v;
        foreach (var sv in v.AllSubViews())
        {
            yield return sv;
        }
    }
}

1

Swift 5.2 e iOS 13.3.1: -

Funciona bem.

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


0

Na minha situação, a solução é

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];

0

Obj-C

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];

Swift 4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red

0

Swift 5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)


0

No Swift 5, você pode fazer algo como abaixo:

yourSearchBar.searchTextField.textColor = .yourColor

0

Isso funcionou para mim.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

-1

Swift 5 Xcode 11.4 iOS 13,4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.