2010-05-07 23 views
30

Lorsque j'abaisse un UISearchBar dans ma vue à l'intérieur d'Interface Builder et change son style en Black Opaque, le bouton d'annulation reste inutilement bleu/gris et ne devient pas noir.UISearchBar annuler la couleur du bouton?

Comment est-ce que je peux noircir le bouton?

EDIT: Il ne fonctionne comme ceci:

// Assume a UISearchBar searchBar. 
NSArray *subviews = [searchBar subviews]; 

// The index depends on how you configure the searchBar. 
UIButton *cancelButton = [subviews objectAtIndex:3]; 

// Set the style to "normal" style. 
[cancelButton setStyle:0]; 

Mais la méthode setStyle: est d'un cadre privé, donc cela pourrait être un problème lors de la présentation de l'application à Apple.

+0

au lieu d'utiliser [canelButton setStyle: 0], utilisez cancelButton.tintColor = [UIColor blackColor]; –

Répondre

26

Le problème avec votre solution est que le code suppose que objectAtIndex: 3 est le bouton d'annulation. Non seulement cela génère un avertissement de compilateur, mais aussi si vous affichez le bouton Annuler par programme (par exemple en utilisant [searchBar setShowsCancelButton:YES], vous risquez de planter l'application.)

Une solution plus simple consiste à définir le style de la barre de recherche entière dans ViewDidLoad(), en utilisant:

searchBar.tintColor = [UIColor colorWithWhite:0.3 alpha:1.0]; 

ceci remplace le style défini dans l'interface Builder mais change aussi la couleur du bouton Annuler pour être la même couleur que la barre entière (bien qu'il ne vous permet pas de définir le style de Annuler bouton indépendamment, malheureusement

+1

Nous pouvons également changer la couleur du bouton d'annulation indépendamment de la couleur de la barre de recherche. searchBar = [[UISearchBar alloc] initWithFrame: CGRectMake (10,346,300,0)]; searchBar.tintColor = [Reusables SKColorFromHexString: @ "# 505a62"]; searchBar.delegate = self; searchBar.showsCancelButton = YES; NSArray * sous-vues = [sous-vues searchBar]; // L'index dépend de la façon dont vous configurez le searchBar. UIButton * cancelButton = [sous-vues objectAtIndex: 2]; cancelButton.tintColor = [UIColor lightTextColor]; –

100

J'ai utilisé quelque chose li ke cela et a travaillé avec moi:

[[UIBarButtonItem appearanceWhenContainedIn: [UISearchBar class], nil] setTintColor:[UIColor blackColor]]; 

il a changé la couleur du bouton d'annulation en noir.

Mise à jour pour iOS 9.0, la méthode appearanceWhenContainedIn est dépréciée, utilisez appearanceWhenContainedInInstancesOfClasses à la place:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTintColor:[UIColor blackColor]]; 

Et Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf:[UISearchBar.self]).tintColor = UIColor.black 
+0

marquer celui-ci comme une réponse, car il est :) – animaonline

+0

marquer cela comme la réponse! –

+0

Déconseillé dans iOS 9: [apple doc] (https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIAppearance_Protocol/index.html#//apple_ref/occ/intfcm/UIAppearance/appearanceWhenContainedIn :) Solution: http://stackoverflow.com/questions/24136874/appearancewhencontainedin-swift/27807417#27807417 –

0

Pour ceux qui cherchent à reproduire le même comportement à Swift :

override func viewWillAppear(animated: Bool) { 
    self.searchBar.tintColor = UIColor.whiteColor() 

    let view: UIView = self.searchBar.subviews[0] as! UIView 
    let subViewsArray = view.subviews 

    for (subView: UIView) in subViewsArray as! [UIView] { 
     println(subView) 
     if subView.isKindOfClass(UITextField){ 
      subView.tintColor = UIColor.blueColor() 
     } 
    } 

} 
1

J'ai pris réponse de Benjamin et combiné avec la sécurité Array recherche pour produire un court, mais la version fonctionnelle de sécurité:

searchController.searchBar.tintColor = UIColor.whiteColor() 
(searchController.searchBar.subviews[safe: 0]?.subviews as? [UIView])? 
    .filter({$0.isKindOfClass(UITextField)}) 
    .map({$0.tintColor = .lightGrayColor()}) 

Il en résulte la coloration sur le bouton Annuler blanc et le curseur lors de la saisie grise. Sinon, il serait blanc et donc pas vu. Le searchController est un objet de type UISearchController. Si quelqu'un veut l'utiliser à l'intérieur du contrôleur de résultats, remplacez-le par self.

La mise en œuvre du safe: est nkukushkin's indice réponse:

extension Array { 
    subscript(safe index: Int) -> T? { 
     return indices(self) ~= index ? self[index] : nil 
    } 
} 
1

Cliquez sur la barre de recherche et définir la teinte couleur sous vue depuis Interface Builder.

enter image description here

1
let view: UIView = self.searchBar.subviews[0] as UIView 
let subViewsArray = view.subviews 

for subView: UIView in subViewsArray { 
    if let cancelButt = subView as? UIButton{ 
     cancelButt.setTitleColor(UIColor.white, for: .normal)   
    } 
} 

Cela a fonctionné pour moi

1

Ceci est une version mise à jour de Hossam Ghareeb's answer above pour Swift 3:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = UIColor.red 

Mais cela ne remplacera pas l'apparence si elle a déjà été mis en ailleurs pour UIBarButtonItem.

Par exemple, dans mon contrôleur navbar je devais changer ceci:

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal) 

Pour cela pour la solution ci-dessus au travail:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.white], for: UIControlState.normal) 
0

pour iOS 10:

UISearchBar.appearance().tintColor = UIColor.red //cancel button color 
UISearchBar.appearance().barTintColor = UIColor.blue //background button color