Como posso alterar a cor do texto de pesquisa UISearchBar?

88

Como posso alterar a cor do texto de um UISearchBar?

MrTourkos
fonte

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
cristão
fonte
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

interromper
fonte
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]
cronikum
fonte
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
fonte
@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
    }
}
Adam Waite
fonte
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.

Juanjo
fonte
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
Tal Zion
fonte
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")
    }
}
Saren Inden
fonte
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.

Loop infinito
fonte
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
    }
}
Omar Albeik
fonte
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!)

Bryan ORTIZ
fonte
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 }
    }
}
David Steppenbeck
fonte
para iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras
2

// Tente esse cara

yourSearchbar.searchTextField.textColor = .white
Nrv
fonte
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;
        }
    }
}
t9mike
fonte
1

Swift 5.2 e iOS 13.3.1: -

Funciona bem.

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

Dinesh Kumar
fonte
0

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

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
poGUIst
fonte
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
Argus
fonte
0

Swift 5:

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

Ramzesenok
fonte
0

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

yourSearchBar.searchTextField.textColor = .yourColor
johnDoe
fonte
0

Isso funcionou para mim.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }
Mili
fonte
-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)
blyscuit
fonte