Come posso modificare il colore del testo di ricerca di UISearchBar?


Risposte:


108

Devi accedere UITextFieldall'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

1
Ho modificato la mia risposta. È possibile accedere al campo utilizzando valueforkey ("searchField")
Christian

7
Non è un'API privata ma è molto fragile e può rompersi con qualsiasi aggiornamento iOS. Non dovresti mai usare cose come queste nel codice di produzione
Lope

2
@Christian - non importa quando è stata pubblicata la risposta originale, si basa ancora su API private. Se fosse pubblico, non sarebbe necessario accedere searchFieldtramite KVC.
Greg Brown,

1
Downvote. Vedi la risposta di @ juanjo e il mio commento per un approccio molto più robusto approvato da Apple e molto meno probabile che si rompa.
Rapina

1
Non utilizzare questa risposta, stai accedendo ad API private e la tua app potrebbe essere rifiutata.
aryaxt

64

Se vuoi impostare il colore del testo per UISearchBar nello storyboard (senza codice), è facile farlo anche (nell'ispettore di identità). Ecco un testo rosso per la barra di ricerca.

inserisci qui la descrizione dell'immagine


2
È meglio avere meno codice per gli elementi di visualizzazione. Grazie.
NRR

Soluzione perfetta!
Mona

50

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]

Lavorando per me.
Surjeet Rajput

e cambia colore per ogni barra di ricerca nel modulo?
Zaporozhchenko Oleksandr

48

Se hai solo bisogno di renderlo leggibile su uno sfondo scuro puoi cambiare barStyle. Quanto segue rende bianchi il testo e i pulsanti nella barra di ricerca:

searchController.searchBar.barStyle = .black

@ Bacon, ha aiutato anche! Grazie
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
    }
}

Come la tua soluzione. Grazie.
Bagusflyer

Puoi anche aggiungere "searchField.backgroundColor" per controllare il colore di sfondo del campo di testo separatamente dalla tinta della barra.
Sherwin Zadeh

14

Questo funziona per me su iOS 11, Xcode 9:

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

Lo scrivo in AppDelegatema immagino che funzioni anche se lo metti da qualche altra parte.


3
Questo è un approccio molto più solido rispetto all'assurdità del valore-chiave nella risposta accettata e in altre risposte. Tuttavia, Apple nella loro saggezza ha deprecato l'API che usi qui e offre una nuova versione per iOS 9.0 e versioni successive, in questo modo: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];Questo è ovviamente Objective-C, con ovvia traduzione in Swift usandoappearance(whenContainedInInstancesOf:)
RobP

2
Non sembra funzionare per me in Xcode 10, iOS 12, su un dispositivo reale.
Oded

11

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")
    }
}

Finalmente! Possiamo accedere direttamente al campo di testo. Grazie, Saren.
Mark Moeykens

10

Il modo più conveniente secondo me è impostare una textColorproprietà 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

non funziona per me. quando imposti la proprietà textcolor?
Kingalione

1
@Kingalione puoi impostare questo in 'viewDidLoad ()'
Tal Zion

Sì, volevo cambiare il colore del testo del placholder. Adesso ho trovato le soluzioni. Grazie comunque
Kingalione

5

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.


3

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
    }
}

3

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 UISearchBarclasse personalizzata , chiamata SearchBar : UISearchBar, UISearchBarDelegate This SearchBaravrà i UISearchBarDelegatemetodi che voglio gestire e il suo delegateset.

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 UITextFieldringraziamento a UISearchBar.searchTextField, che è di tipo UISearchTextField, che eredita daUITextField .

Poiché conosco la mia gerarchia, so textFieldche non sarà nillper 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 SearchBaraggiungendo 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!).


2

(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 }
    }
}

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

2

// Prova questo ragazzo

yourSearchbar.searchTextField.textColor = .white

2

Swift 5.2 e iOS 13.3.1: -

Funziona bene.

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


1

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;
        }
    }
}

0

Nella mia situazione la soluzione è

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

In Swift 5 puoi fare qualcosa come di seguito:

yourSearchBar.searchTextField.textColor = .yourColor

0

Questo ha funzionato per me.

    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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.