Come cambiare il segnaposto di UISearchBar e il colore della tinta dell'image?

Ho provato i risultati di ricerca per ore, ma non riesco a capire. Forse non è ansible. Sto cercando di cambiare il colore della tinta del text segnaposto e della lente d'ingrandimento di una UISearchBar. Mi occupo solo di iOS 8.0+ se ciò è importnte. Ecco il mio codice e come appare ora:

let searchBar = UISearchBar() searchBar.placeholder = "Search" searchBar.searchBarStyle = UISearchBarStyle.Minimal searchBar.tintColor = UIColor.whiteColor() 

un gatto occupato

Mi piacerebbe che la ricerca e la lente d'ingrandimento fossero bianche, o forse un verde scuro.

Solutions Collecting From Web of "Come cambiare il segnaposto di UISearchBar e il colore della tinta dell'image?"

Se si dispone di un'image personalizzata che è ansible utilizzare, è ansible impostare l'image e modificare il colore del text segnaposto utilizzando qualcosa di simile al seguente:

 [searchBar setImage:[UIImage imageNamed:@"SearchWhite"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal]; UITextField *searchTextField = [searchBar valueForKey:@"_searchField"]; if ([searchTextField respondsToSelector:@selector(setAttributedPlaceholder:)]) { UIColor *color = [UIColor purpleColor]; [searchTextField setAttributedPlaceholder:[[NSAttributedString alloc] initWithString:@"Search" attributes:@{NSForegroundColorAttributeName: color}]]; } 

In questo esempio ho usato purpleColor, invece puoi usare il + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha metodo + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha per creare il tuo colore verde scuro personalizzato.

EDIT: Ho appena capito che stavi scrivendo in rapida … duh. Ho digitato rapidamente questo messaggio in modo da non lasciare la risposta solo in Obj-C.

  searchBar.setImage(UIImage(named: "SearchWhite"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal); var searchTextField: UITextField? = searchBar.valueForKey("searchField") as? UITextField if searchTextField!.respondsToSelector(Selector("attributedPlaceholder")) { var color = UIColor.purpleColor() let attributeDict = [NSForegroundColorAttributeName: UIColor.purpleColor()] searchTextField!.attributedPlaceholder = NSAttributedString(string: "search", attributes: attributeDict) } 

Swift 3.0

  var searchTextField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField if searchTextField!.responds(to: #selector(getter: UITextField.attributedPlaceholder)) { let attributeDict = [NSForegroundColorAttributeName: UIColor.white] searchTextField!.attributedPlaceholder = NSAttributedString(string: "Search", attributes: attributeDict) } 

Swift 4 / xcode 9.0, Swift 3 / xcode 8.2.1

UISearchBar campione di personalizzazione

Estensione UISearchBar

 import UIKit extension UISearchBar { private func getViewElement<T>(type: T.Type) -> T? { let svs = subviews.flatMap { $0.subviews } guard let element = (svs.filter { $0 is T }).first as? T else { return nil } return element } func getSearchBarTextField() -> UITextField? { return getViewElement(type: UITextField.self) } func setTextColor(color: UIColor) { if let textField = getSearchBarTextField() { textField.textColor = color } } func setTextFieldColor(color: UIColor) { if let textField = getViewElement(type: UITextField.self) { switch searchBarStyle { case .minimal: textField.layer.backgroundColor = color.cgColor textField.layer.cornerRadius = 6 case .prominent, .default: textField.backgroundColor = color } } } func setPlaceholderTextColor(color: UIColor) { if let textField = getSearchBarTextField() { textField.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes: [NSForegroundColorAttributeName: color]) } } func setTextFieldClearButtonColor(color: UIColor) { if let textField = getSearchBarTextField() { let button = textField.value(forKey: "clearButton") as! UIButton if let image = button.imageView?.image { button.setImage(image.transform(withNewColor: color), for: .normal) } } } func setSearchImageColor(color: UIColor) { if let imageView = getSearchBarTextField()?.leftView as? UIImageView { imageView.image = imageView.image?.transform(withNewColor: color) } } } 

Estensione UIImage ( https://stackoverflow.com/a/40884483/4488252 )

 import UIKit extension UIImage { func transform(withNewColor color: UIColor) -> UIImage { UIGraphicsBeginImageContextWithOptions(size, false, scale) let context = UIGraphicsGetCurrentContext()! context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(.normal) let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) context.clip(to: rect, mask: cgImage!) color.setFill() context.fill(rect) let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage } } 

uso

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 44)) searchBar.searchBarStyle = .minimal view.addSubview(searchBar) searchBar.placeholder = "placeholder" searchBar.setTextColor(color: .brown) searchBar.setTextFieldColor(color: UIColor.green.withAlphaComponent(0.3)) searchBar.setPlaceholderTextColor(color: .white) searchBar.setSearchImageColor(color: .white) searchBar.setTextFieldClearButtonColor(color: .red) } } 

Risultato

inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui

Swift 3: se si desidera modificare il segnaposto, il tasto clear e il vetro lente d'ingrandimento

  let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField textFieldInsideSearchBar?.textColor = UIColor.white let textFieldInsideSearchBarLabel = textFieldInsideSearchBar!.value(forKey: "placeholderLabel") as? UILabel textFieldInsideSearchBarLabel?.textColor = UIColor.white let clearButton = textFieldInsideSearchBar?.value(forKey: "clearButton") as! UIButton clearButton.setImage(clearButton.imageView?.image?.withRenderingMode(.alwaysTemplate), for: .normal) clearButton.tintColor = UIColor.white let glassIconView = textFieldInsideSearchBar?.leftView as? UIImageView glassIconView?.image = glassIconView?.image?.withRenderingMode(.alwaysTemplate) glassIconView?.tintColor = UIColor.white 

Puoi cambiare il colore del text senza violare la regola API privata:

 UILabel.appearanceWhenContainedInInstancesOfClasses([UITextField.self]).textColor = UIColor.whiteColor() 

Ho trovato un modo per modificare il file di text nella barra di ricerca. Funziona in swift 3 e Xcode8.

In primo luogo, sottoclass la class UISearchBar.

 class CustomSearchBar: UISearchBar { 

UISearchBar include una vista che ha il field di text importnte che volevi. La seguente function ottiene l'indice nelle sottoview.

 func indexOfSearchFieldInSubviews() -> Int! { var index: Int! let searchBarView = subviews[0] for (i, subview) in searchBarView.subviews.enumerated() { if subview.isKind(of: UITextField.self) { index = i break } } return index } override func draw(_ rect: CGRect) { // Find the index of the search field in the search bar subviews. if let index = indexOfSearchFieldInSubviews() { // Access the search field let searchField: UITextField = subviews[0].subviews[index] as! UITextField // Set its frame. searchField.frame = CGRect(x: 5, y: 5, width: frame.size.width - 10, height: frame.size.height - 10) // Set the font and text color of the search field. searchField.font = preferredFont searchField.textColor = preferredTextColor // Set the placeholder and its color let attributesDictionary = [NSForegroundColorAttributeName: preferredPlaceholderColor.cgColor] searchField.attributedPlaceholder = NSAttributedString(string: preferredPlaceholder, attributes: attributesDictionary) // Set the background color of the search field. searchField.backgroundColor = barTintColor } super.draw(rect) } 

Eccoti, divertiti per questo.

Non riuscivo a farlo funzionare correttamente con nessuna delle soluzioni di cui sopra.

Ho creato la seguente categoria UISearchBar che funziona correttamente su iOS 8.4 e 10.3 :

UISearchBar + PlaceholderColor.h

 #import <UIKit/UIKit.h> @interface UISearchBar (PlaceholderColor) - (void)setPlaceholderColor:(UIColor *)placeholderColor; @end 

UISearchBar + PlaceholderColor.m

 #import "UISearchBar+PlaceholderColor.h" @implementation UISearchBar (PlaceholderColor) - (void)setPlaceholderColor:(UIColor *)placeholderColor { UILabel *labelView = [self searchBarTextFieldLabelFromView:self]; [labelView setTextColor:placeholderColor]; } - (UILabel *)searchBarTextFieldLabelFromView:(UIView *)view { for (UIView *v in [view subviews]) { if ([v isKindOfClass:[UILabel class]]) { return (UILabel *)v; } UIView *labelView = [self searchBarTextFieldLabelFromView:v]; if (labelView) { return (UILabel *)labelView; } } return nil; } @end 

USO :

 [mySearchBar setPlaceholderColor:[UIColor redColor]]; 

NOTA IMPORTANTE:

Assicurati di call setPlaceholderColor: DOPO che la tua UISearchBar è stata aggiunta alla vista e ha creato la sua gerarchia delle viste.

Se apri la barra di ricerca a livello di programmazione, chiamala DOPO la tua chiamata a Diventa PrimoRispettore, in quanto tale:

 [mySearchBar becomeFirstResponder]; [searchBar setPlaceholderColor:[UIColor redColor]]; 

Altrimenti, se stai sfruttando UISearchBarDelegate :

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { [searchBar setPlaceholderColor:[UIColor redColor]]; } 

Piccolo aggiornamento alla grande risposta di Vasily Bodnarchuk.

Swift 4+

NSForegroundColorAttributeName è stato modificato in NSAttributedStringKey.foregroundColor