2015-11-17 11 views
7

ho una barra di ricerca:Impossibile modificare il colore di sfondo barra di ricerca

let searchBar:UISearchBar = UISearchBar(frame: CGRectMake((searchView.frame.width - UIScreen.mainScreen().bounds.width/1.6)/2, 0, UIScreen.mainScreen().bounds.width/1.6, 24)) 

e voglio cambiare il colore di sfondo parte di immissione del testo. Per questo ho provato:

searchBar.barTintColor = UIColor(red: 0/255, green: 74/255, blue: 103/255, alpha: 1) 

searchBar.backgroundColor = UIColor.redColor() 

ma queste due varianti non funzionano. Come posso cambiare il colore di sfondo del mio testo UISearchBarInput e cosa ho sbagliato?

+0

Vedere progetto dimostrativo, Aggiungo SearchBar in StoryBoard. –

risposta

7

progetto See Demo: Demo

Si sta aggiungendo il codice qui sotto in viewDidLoad e cambiare il campo di testo di sfondo colore ROSSO,

for subView in searchBar.subviews 
{ 
    for subView1 in subView.subviews 
    { 

     if subView1.isKindOfClass(UITextField) 
     { 
      subView1.backgroundColor = UIColor.redColor() 
     } 
    } 

} 

Rosso Colore del TextField in SearchBar.

enter image description here

+0

no, non funziona =/ –

+0

Non so perché, ma ho provato molte soluzioni e nessuno lavora per me =/ –

+0

sopra il progetto demo Scarica e implementalo come demo nel tuo progetto. –

7

Se si desidera solo cambiare nel vostro ViewController e non si desidera in qualsiasi altro luogo per effettuare quindi utilizzare

for view in searchBar.subviews { 
      for subview in view.subviews { 
       if subview .isKindOfClass(UITextField) { 
        let textField: UITextField = subview as! UITextField 
        textField.backgroundColor = UIColor.redColor() 
       } 
      } 
     } 

Ma se si vuole che sia il cambiamento in tutta l'app e il targeting l'iOS 9.0 o versione successiva, allora dovrebbe usare appearanceWhenContainedInInstancesOfClasses come

UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).backgroundColor = UIColor.redColor() 
+0

Non so perché, ma ancora non cambia il colore –

+0

qui è http://www.filedropper.com/test_20 l'esempio in cui entrambi i metodi sono usati e funzionanti confronta i tuoi e scopri cosa stai facendo male – Imran

+0

doesn lavoro sulla mia parte – Cesare

0

Basta provare il codice come di seguito in un parco giochi. Se ancora non funziona, aggiungere più il codice alla tua domanda ...

let searchView = UIView(frame: CGRect(x: 0.0,y: 0.0, width: 100, height: 50)) 

let searchBar:UISearchBar = UISearchBar(frame: CGRectMake((searchView.frame.width - UIScreen.mainScreen().bounds.width/1.6)/2, 0, UIScreen.mainScreen().bounds.width/1.6, 24)) 

for subView in searchBar.subviews { 
    for subViewInSubView in subView.subviews { 
     if subViewInSubView.isKindOfClass(UITextField) { 
      subViewInSubView.backgroundColor = UIColor.purpleColor() 
     } 
    } 
} 
4

Proprio come questo

let searchBar:UISearchBar = UISearchBar(frame: CGRectMake((searchView.frame.width - UIScreen.mainScreen().bounds.width/1.6)/2, 0, UIScreen.mainScreen().bounds.width/1.6, 24)) 
let searchTextField = searchBar.valueForKey("_searchField") as? UITextField 
searchTextField?.backgroundColor = UIColor.redColor() 
2

Una risposta molto comune a questa domanda sul web è questa soluzione sopra descritta:

for subView in searchBar.subviews { 
    for subViewInSubView in subView.subviews { 
     if subViewInSubView.isKindOfClass(UITextField) { 
      subViewInSubView.backgroundColor = UIColor.purpleColor() 
     } 
    } 
} 

Ma non ha funzionato per me utilizzando XCode 7 e iOS 9, e ho notato che tutto il web molti altri hanno riferito che non ha funzionato per loro, neanche. Ho scoperto che la sottoview UITextField non viene creata (o almeno non è aggiunta come sottoview) finché non viene referenziata, e un modo in cui può essere referenziato è dal campo segnaposto, ad esempio, si potrebbe aggiungere questa linea prima di cercare le subviews per la classe UITextField:

searchBar.placeholder = searchBar.placeholder 
+0

Aggiungere il segnaposto prima di cercare le sottoview ha fatto la differenza per me, buona cattura! – JustinM

2

il modo per farlo solo utilizzando le API di Apple è quello di creare un'immagine e utilizzare setSearchFieldBackgroundImage:

self.searchBar.setSearchFieldBackgroundImage(UIImage(named: "SearchFieldBackground"), for: UIControlState.normal) 

sarà anche animare gli angoli correttamente se si crea una arrotondato a rect e mostra e nascondi dinamicamente i pulsanti.

Esempio utilizzando questa immagine: enter image description here

enter image description here

+0

È lo stesso che basta impostare 'backgroundColor' su' searchBar'. Solo inutilmente complicato e non risolve il problema della tinta, perché non è possibile modificare correttamente la tinta del testo o lo sfondo del campo di testo in modo che corrisponda allo sfondo –

+0

backgroundColor non cambia nulla per me –

7

Per Swift 3+, utilizzare questo:

for subView in searchController.searchBar.subviews { 

    for subViewOne in subView.subviews { 

     if let textField = subViewOne as? UITextField { 

      subViewOne.backgroundColor = UIColor.red 

      //use the code below if you want to change the color of placeholder 
      let textFieldInsideUISearchBarLabel = textField.value(forKey: "placeholderLabel") as? UILabel 
       textFieldInsideUISearchBarLabel?.textColor = UIColor.blue 
     } 
    } 
} 
0

faccio con questo modo (Swift 3+ soluzione):

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField 
textFieldInsideSearchBar?.backgroundColor = UIColor.red 
1

Set qualsiasi colore desiderato. SWIFT 3

public extension UISearchBar { 
    public func setStyleColor(_ color: UIColor) { 
    tintColor = color 
    guard let tf = (value(forKey: "searchField") as? UITextField) else { return } 
    tf.textColor = color 
    if let glassIconView = tf.leftView as? UIImageView, let img = glassIconView.image { 
     let newImg = img.blendedByColor(color) 
     glassIconView.image = newImg 
    } 
    if let clearButton = tf.value(forKey: "clearButton") as? UIButton { 
     clearButton.setImage(clearButton.imageView?.image?.withRenderingMode(.alwaysTemplate), for: .normal) 
     clearButton.tintColor = color 
    } 
    } 
} 

extension UIImage { 

    public func blendedByColor(_ color: UIColor) -> UIImage { 
    let scale = UIScreen.main.scale 
    if scale > 1 { 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
    } else { 
     UIGraphicsBeginImageContext(size) 
    } 
    color.setFill() 
    let bounds = CGRect(x: 0, y: 0, width: size.width, height: size.height) 
    UIRectFill(bounds) 
    draw(in: bounds, blendMode: .destinationIn, alpha: 1) 
    let blendedImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return blendedImage! 
    } 
} 
1

FWIW sto risolvere questo problema creando una variabile calcolata denominata textField.

extension UISearchBar { 
    var textField: UITextField? { 
     return subviews.first?.subviews.first(where: { $0.isKind(of: UITextField.self) }) as? UITextField 
    } 
}