Come posso cambiare il colore del testo di un UISearchBar
?
Risposte:
Devi accedere UITextField
all'interno della UISearchBar. Puoi farlo usandovalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Aggiornamento Swift 3
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
tramite KVC.
Lavorare in Swift 4 per me:
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
}
}
Questo funziona per me su iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Lo scrivo in AppDelegate
ma immagino che funzioni anche se lo metti da qualche altra parte.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Questo è ovviamente Objective-C, con ovvia traduzione in Swift usandoappearance(whenContainedInInstancesOf:)
Da Xcode 11 e iOS 13 è diventato possibile accedere direttamente al campo di testo:
searchBar.searchTextField
Potresti scrivere del codice per renderlo sempre accessibile in questo modo.
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
}
}
Potresti anche renderlo non opzionale con errori fatali, questo codice è testato da iOS 7 fino a iOS 13GM. Ma preferirei solo la versione opzionale.
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")
}
}
Il modo più conveniente secondo me è impostare una textColor
proprietà 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
}
}
}
}
Utilizzo
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
}
}
}
}
Lo useresti come:
searchBar.textColor = UIColor.blueColor() // Your color
Prova questo,
searchBar.searchTextField.textColor = .white
Lo sto usando con l'app mirata a iOS 11 in poi.
[Aggiornamento] Ho notato che l'app si arresta in modo anomalo nelle versioni precedenti (<iOS 13), ma il compilatore non si è mai lamentato del controllo della versione, qualcuno spiega perché è successo.
Puoi farlo accedendo a UITextField all'interno della searchBar, quindi puoi cambiare il suo colore di sfondo, il colore del testo e tutte le altre proprietà di UITextField
aggiungi la seguente estensione per accedere al 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
}
}
Ho provato alcune delle soluzioni scritte sopra ma non hanno funzionato (più, immagino).
Se vuoi gestire solo iOS 13:
mySearchBar.searchTextField.textColor = .red
Ma se vuoi gestire anche iOS meno recenti, ecco come ho fatto:
Crea una UISearchBar
classe personalizzata , chiamata SearchBar : UISearchBar, UISearchBarDelegate
This SearchBar
avrà i UISearchBarDelegate
metodi che voglio gestire e il suo delegate
set.
E aggiungo alla classe:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
Breve spiegazione:
Con iOS13 ora, puoi accedere al UITextField
ringraziamento a UISearchBar.searchTextField
, che è di tipo UISearchTextField
, che eredita daUITextField
.
Poiché conosco la mia gerarchia, so textField
che non sarà nill
per le versioni precedenti, quindi in entrambi i casi ottengo un campo di testo che posso facilmente personalizzare, lavorando su ogni versione, dalla 9 alla 13 di oggi.
Ecco il codice completo necessario per farlo funzionare:
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
}
}
}
Puoi anche impostare alcune personalizzazioni SearchBar
aggiungendo questo su:
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
Quindi lo imposti su XIB / Storyboard e lo gestisci come se fosse un semplice UISearchBar
(se non hai dimenticato i delegati!).
(Questa soluzione è stata testata solo per Xcode 10 e iOS 12). Aggiungi un'estensione per accedere al campo di testo della barra di ricerca:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
}
}
Quindi utilizza quella proprietà per impostare il colore del testo del campo di testo nella barra di ricerca:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// MODIFICARE
Il codice sopra non funziona per iOS 13. Un modo migliore per gestirlo è usare:
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 }
}
}
Swift 5.2 e iOS 13.3.1: -
Funziona bene.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Ecco una versione Xamarin.iOS C # dell'approccio "trova UITextField". Non si arresta in modo anomalo se UITextField scompare nella futura gerarchia della vista 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:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
Questo ha funzionato per me.
if #available(iOS 13.0, *) {
searchBar.searchTextField.textColor = .white
}