Cómo cambiar el marcador de posición UISearchBar y el color del tinte de la imagen?

He estado probando los resultados de búsqueda durante horas, pero no puedo descifrar esto. Quizás no es posible. Intento cambiar el color del tinte del marcador de posición y la lupa de UISearchBar. Solo apuntaré a iOS 8.0+ si eso es importante. Aquí está mi código y cómo se ve ahora:

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

un gato ocupado

Me gustaría que la búsqueda y la lupa sean blancas, o tal vez de color verde oscuro.

Si tiene una imagen personalizada que podría usar, puede establecer la imagen y cambiar el color del marcador de posición utilizando algo similar a lo siguiente:

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

En ese ejemplo usé purpleColor, en su lugar puedes usar el + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha para crear tu color verde oscuro personalizado.

EDITAR: Me acabo de dar cuenta de que lo estabas escribiendo rápidamente … duh. Rápidamente escribí esto, así que no dejé la respuesta solo en 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 muestra de personalización

Extensión UISearchBar

 import UIKit extension UISearchBar { private func getViewElement(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) } } } 

Extensión 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) } } 

Resultado

enter image description here enter image description here

Swift 3: si desea cambiar el marcador de posición, el botón borrar y la lupa de cristal

  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 

Puede cambiar el color del texto sin violar la regla de API privada:

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

Encontré una manera de cambiar el texto archivado en la barra de búsqueda. Funciona en Swift 3 y Xcode8.

En primer lugar, subclase de la clase UISearchBar.

 class CustomSearchBar: UISearchBar { 

UISearchBar incluye una vista que tiene el campo de texto importante que quería. La siguiente función obtiene el índice en las subvistas.

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

Ahí vas, disfruta por esto.

 extension UISearchBar { var textField: UITextField? { return value(forKey: "searchField") as? UITextField } var placeholderLabel: UILabel? { return textField?.value(forKey: "placeholderLabel") as? UILabel } var icon: UIImageView? { return textField?.leftView as? UIImageView } var iconColor: UIColor? { get { return icon?.tintColor } set { icon?.image = icon?.image?.withRenderingMode(.alwaysTemplate) icon?.tintColor = newValue } } } 

No pude hacerlo funcionar correctamente con ninguna de las soluciones anteriores.

Creé la siguiente categoría UISearchBar que funciona correctamente en iOS 8.4 y 10.3 :

UISearchBar + PlaceholderColor.h

 #import  @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:

Asegúrese de llamar a setPlaceholderColor: DESPUÉS de que su UISearchBar se haya agregado a la vista y haya creado su jerarquía de vistas.

Si abre su barra de búsqueda programáticamente, llámela DESPUÉS de su llamada a becomeFirstResponder, como tal:

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

De lo contrario, si está aprovechando UISearchBarDelegate :

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

Pequeña actualización de la gran respuesta de Vasily Bodnarchuk.

Swift 4+

NSForegroundColorAttributeName se ha cambiado a NSAttributedStringKey.foregroundColor

Para cualquiera que intente cambiar el texto y tenga problemas para ver el marcador de posición actualizado, funcionó para mí al ponerlo aquí en lugar de viewDidLoad .

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.searchBar.placeholder = @"My Custom Text"; } 

Se realizó una extensión de barra de búsqueda Apple Swift versión 4.1: –

import Foundation import UIKit extension UISearchBar{ func setTextField(placeHolderColor:UIColor = .gray,placeHolder:String = "Search Something",textColor:UIColor = .white,backgroundColor:UIColor = .black, placeHolderFont:UIFont = UIFont.systemFont(ofSize: 12.0), textFont:UIFont = UIFont.systemFont(ofSize: 12.0) ){ for item in self.subviews{ for mainView in (item as UIView).subviews{ mainView.backgroundColor = backgroundColor if mainView is UITextField{ let textField = mainView as? UITextField if let _textF = textField{ _textF.text = "success" _textF.textColor = textColor _textF.font = textFont _textF.attributedPlaceholder = NSMutableAttributedString.init(string: placeHolder, attributes: [NSAttributedStringKey.foregroundColor : placeHolderColor, NSAttributedStringKey.font : placeHolderFont]) } } } } } }

A continuación, puede utilizar esto para su barra de búsqueda de esta manera: – controller.searchBar.setTextField(placeHolderColor: .white, placeHolder: "Search A Pet", textColor: .white, backgroundColor: .green, placeHolderFont: UIFont.systemFont(ofSize: 14.0), textFont: UIFont.systemFont(ofSize: 14.0))

Espero que esta contribución funcione para mis otros amigos 🙂 Feliz encoding !!

En Swift 4, suponiendo que su controlador de búsqueda esté configurado así:

 let searchController = UISearchController(searchResultsController: nil) 

a continuación, establezca el texto del marcador de posición de la siguiente manera:

 searchController.searchBar.placeholder = "Here is my custom text"