Como posso alterar a cor do texto de um UISearchBar
?
ios
swift
uisearchbar
MrTourkos
fonte
fonte
searchField
via KVC.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.
fonte
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]
fonte
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:
fonte
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 } }
fonte
Isso funciona para mim no iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Eu escrevo no
AppDelegate
mas acho que funciona se você colocar em outro lugar também.fonte
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Este é, obviamente, Objective-C, com tradução óbvia para Swift usandoappearance(whenContainedInInstancesOf:)
Acho que a maneira mais conveniente é definir uma
textColor
propriedade emUISearchBar
.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
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
fonte
Desde o Xcode 11 e iOS 13, tornou-se possível acessar o campo de texto diretamente:
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") } }
fonte
Tente isto,
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.
fonte
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 } }
fonte
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
UISearchBar
classe personalizada , chamadaSearchBar : UISearchBar, UISearchBarDelegate
ThisSearchBar
terá osUISearchBarDelegate
métodos que desejo tratar e seudelegate
conjunto.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
UITextField
agradecimentos aUISearchBar.searchTextField
, que é do tipoUISearchTextField
, que herda deUITextField
.Como conheço minha hierarquia, sei
textField
que não seránill
para 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
SearchBar
adicionando 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!)fonte
(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 } } }
fonte
// Tente esse cara
fonte
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; } } }
fonte
Swift 5.2 e iOS 13.3.1: -
Funciona bem.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
fonte
Na minha situação, a solução é
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]]; [appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
fonte
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
fonte
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
fonte
No Swift 5, você pode fazer algo como abaixo:
fonte
Isso funcionou para mim.
if #available(iOS 13.0, *) { searchBar.searchTextField.textColor = .white }
fonte
Swift 5 Xcode 11.4 iOS 13,4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
fonte