Modificación del color y el estilo del text de la fuente del button UISearchBar Cancel

¿Hay alguna manera de cambiar la fuente y el color del text del button Cancelar de UISearchBar sin subclasificar la barra de búsqueda?

Puede cambiar el estilo del button Cancelar al cambiar la apariencia de UIBarButtonItem cuando está contenido en UISearchBar .

Por ejemplo,

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor blueColor], UITextAttributeTextColor, [UIColor darkGrayColor], UITextAttributeTextShadowColor, [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], UITextAttributeTextShadowOffset, nil] forState:UIControlStateNormal]; 

Swift 3

 let attributes = [ NSForegroundColorAttributeName : UIColor.white, NSFontAttributeName : UIFont.systemFont(ofSize: 17) ] UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal) 

Basado en la respuesta de htinlinn, esto es lo que utilicé en mi método viewDidLoad del controller de vista utilizando la barra de búsqueda en iOS 7:

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; 

Versión Swift simplificada de @htinlinn respuesta:

 let attributes = [ NSForegroundColorAttributeName : UIColor.textBlueColor, NSFontAttributeName : UIFont.systemFontOfSize(13) ] UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).setTitleTextAttributes(attributes, forState: .Normal) 

Para modificar el button de cancelar la barra de búsqueda, debe tomar el object Botón y cambiar la reference de ese button a su button personalizado.

 UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(50,20,300,30)]; searchBar.delegate = self; searchBar.barStyle = UIBarStyleDefault; searchBar.showsCancelButton = YES; UIButton *cancelButton; for (id button in searchBar.subviews) { if ([button isKindOfClass:[UIButton class]]) { cancelButton=(UIButton*)button; break; } } 

Puede usar la propiedad de tinte de searchBar para cambiar el color de searchBar, el color del button de cancelar se cambiará pero de acuerdo con el color de UISearchBar. No puedo editarlo manualmente. Pero siempre puede poner una costumbre sobre él en el generador de interfaces que ocultará el button de cancelación nativo. Y el usuario utilizará su button personalizado como el button de cancelación de la barra de búsqueda.

Solución Swift después de iOS 9.0 (modificando la respuesta de htinlinn):

 if #available(iOS 9.0, *) { UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.classForCoder()]) .setTitleTextAttributes([ NSFontAttributeName: UIFont.systemFontOfSize(12), NSForegroundColorAttributeName: UIColor.blueColor(), NSShadowAttributeName: NSShadow(color: UIColor.networkingColor(), offset: CGSizeMake(0, -1), blurRadius: 2) ], forState: UIControlState.Normal) } else { // Link to Objective-C Method } 

Y el actual método Objective-C ( UITextAttributeTextColor está en desuso desde iOS 7.0):

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:@{ NSForegroundColorAttributeName: [UIColor blueColor], NSFontAttributeName: [UIFont systemFontOfSize:12]} forState:UIControlStateNormal]; 

Mi pequeña extensión de sombra utilizada en el código anterior:

 extension NSShadow { convenience init(color: AnyObject!, offset: CGSize, blurRadius: CGFloat) { self.init() self.shadowColor = color self.shadowOffset = offset self.shadowBlurRadius = blurRadius } } 

Si solo desea modificar el button Cancelar , puede hacerlo mediante:

 if let cancelButton = searchBar.valueForKey("cancelButton") as? UIButton { cancelButton.setTitle(<your_string>, forState: <UIControlState>) cancelButton.setTitleColor(<your_uicolor>, forState: <UIControlState>) cancelButton.setAttributedTitle(<your_nsattributedstring>, forState: <UIControlState>) } 

donde searchBar es tu object UISearchBar .

Una solución mucho mejor aquí

 UIButton *cancelButton = [searchBar valueForKey:@"_cancelButton"]; [cancelButton setTitleColor:[UIColor yourColor] forState:UIControlStateNormal]; [cancelButton setTitle:@"Your Text" forState:UIControlStateNormal]; 

y de manera similar, puede cambiar otras properties de estilo y text del button.

Prueba esta:

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"SourceSansPro-Regular" size:14]} forState:UIControlStateNormal];