Como posso alterar a cor do texto de um UISearchBar
?
Respostas:
Você tem que acessar o UITextField
dentro 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
searchField
via KVC.
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]
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
}
}
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.
[[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 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
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")
}
}
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.
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
}
}
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 , chamada SearchBar : UISearchBar, UISearchBarDelegate
This SearchBar
terá os UISearchBarDelegate
métodos que desejo tratar e seu delegate
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 a UISearchBar.searchTextField
, que é do tipo UISearchTextField
, que herda de UITextField
.
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!)
(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 }
}
}
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;
}
}
}
Swift 5.2 e iOS 13.3.1: -
Funciona bem.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)