Cette question a été posée tout à l'heure, donc je suppose que la personne qui a demandé a déjà trouvé une solution. Mais juste au cas où certains l'autre il arrive de tomber sur le même problème. Voici ma solution.
J'ai un UISearchBar avec un bouton annuler qui n'apparaît que lorsque le champ de la UISearchBar est exploité. La solution de remplacement -(void)layoutSubviews dans une sous-classe de UISearchBar était donc pas une option pour moi. De toute façon j'ai fait une sous-classe de UISearchBar (CustomSearchBar) avec une méthode publique pour le réglage de la police et textColor du bouton annuler. Lorsque je crée le UISearchBar j'assurez-vous que la barre de recherche textfield délégué est réglé sur auto et la classe qui crée la barre de recherche, met en œuvre la UITextFieldDelegate protocole. Lorsque l'utilisateur appuie sur la barre de recherche textfield, son délégué est informé et appelle la méthode de CustomSearchBar. La raison pourquoi je le fais ici, c'est parce que c'est le moment où le bouton annuler s'affiche et donc je sais qu'il est sur le point de vue de la hiérarchie et que je peux faire sa personnalisation.
Voici le code:
Pour la création de la UISearchBar dans MyRootViewController
Et c'est la méthode publique dans le UISearchBar sous-classe
-(void)setCloseButtonFont:(UIFont*)font textColor:(UIColor*)textColor
{UIButton*cancelButton = nil;for(UIView*subView in self.subviews){if([subView isKindOfClass:[UIButtonclass]]){
cancelButton =(UIButton*)subView;}}if(cancelButton){/* For some strange reason, this code changes the font but not the text color. I assume some other internal customizations make this not possible:
UILabel *titleLabel = [cancelButton titleLabel];
[titleLabel setFont:font];
[titleLabel setTextColor:[UIColor redColor]];*///Therefore I had to create view with a label on top: UIView*overlay =[[UIView alloc] initWithFrame:CGRectMake(2,2, kCancelButtonWidth, kCancelButtonLabelHeight)];[overlay setBackgroundColor:[UIColor whiteColor]];[overlay setUserInteractionEnabled:NO];//This is important for the cancel button to work[cancelButton addSubview:overlay];UILabel*newLabel =[[UILabel alloc] initWithFrame:CGRectMake(0,2, kCancelButtonWidth, kCancelButtonLabelHeight)];[newLabel setFont:font];[newLabel setTextColor:textColor];//Text "Cancel" should be localized for other languages[newLabel setText:@"Cancel"];[newLabel setTextAlignment:UITextAlignmentCenter];//This is important for the cancel button to work[newLabel setUserInteractionEnabled:NO];[overlay addSubview:newLabel];[newLabel release];[overlay release];}}
C'est génial. Merci beaucoup pour cette. J'ai utilisé une autre méthode que je ne suis pas très heureux avec. Mais avec ce que je peux re-visite de la question maintenant. Merci! Je suis content que cela vous a aidé.
Au lieu de faire toutes ces choses de fantaisie, juste de mettre en œuvre la SearchBarTextDidBeginEditing comme ce
-(void)searchBarTextDidBeginEditing:(UISearchBar*)searchBar
{//only show the status bar’s cancel button while in edit mode sbar (UISearchBar)
searchBar.showsCancelButton = YES;
searchBar.autocorrectionType =UITextAutocorrectionTypeNo;UIColor*desiredColor =[UIColor colorWithRed:212.0/255.0 green:237.0/255.0 blue:187.0/255.0 alpha:1.0];for(UIView*subView in searchBar.subviews){if([subView isKindOfClass:[UIButtonclass]]){NSLog(@"this is button type");[(UIButton*)subView setTintColor:desiredColor];[(UIButton*)subView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];}}
Vous pouvez sous-classe UISearchBar et écrire votre propre - (void)layoutSubviews méthode. Dans cette méthode, en boucle par le biais de son sous-vues et obtenir le cancelButton. Le reste doit être simple.
merci pour la réponse. Cependant, je ne suis pas très familier avec la façon dont je peux réécrire le layoutSubView méthode. Pouvez-vous me guider moi-même sur ce point? Primordial -(void)layoutSubviews ne fonctionne que si le UISearchBar de la propriété showsCancelButton est définie sur OUI. Par défaut, cette valeur est définie sur NON et, par conséquent, le bouton annuler n'apparaît qu'une fois la UISearchBar textfield est touché. Dans ce cas primordial layoutSubviews aurait aucun effet.
Cela ressemble à cela affecte la taille de la police, pas la couleur. Donc, u pouvez modifier la police, u peut également modifier la titleColor. [bouton setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
Cette question a été posée tout à l'heure, donc je suppose que la personne qui a demandé a déjà trouvé une solution. Mais juste au cas où certains l'autre il arrive de tomber sur le même problème. Voici ma solution.
J'ai un UISearchBar avec un bouton annuler qui n'apparaît que lorsque le champ de la UISearchBar est exploité. La solution de remplacement -(void)layoutSubviews dans une sous-classe de UISearchBar était donc pas une option pour moi. De toute façon j'ai fait une sous-classe de UISearchBar (CustomSearchBar) avec une méthode publique pour le réglage de la police et textColor du bouton annuler. Lorsque je crée le UISearchBar j'assurez-vous que la barre de recherche textfield délégué est réglé sur auto et la classe qui crée la barre de recherche, met en œuvre la UITextFieldDelegate protocole. Lorsque l'utilisateur appuie sur la barre de recherche textfield, son délégué est informé et appelle la méthode de CustomSearchBar. La raison pourquoi je le fais ici, c'est parce que c'est le moment où le bouton annuler s'affiche et donc je sais qu'il est sur le point de vue de la hiérarchie et que je peux faire sa personnalisation.
Voici le code:
Pour la création de la UISearchBar dans MyRootViewController
UITextFieldDelegate dans MyRootViewController (assurez-vous qu'elle met en œuvre la UITextFieldDelegate protocole)
Et c'est la méthode publique dans le UISearchBar sous-classe
Je suis content que cela vous a aidé.
OriginalL'auteur strave
Au lieu de faire toutes ces choses de fantaisie, juste de mettre en œuvre la SearchBarTextDidBeginEditing comme ce
OriginalL'auteur Gyanendra Singh
Gyanerdra réponse fonctionne bien. Mais pour iOS7 j'avais besoin de faire la modification suivante pour que ça marche dans mon application.
Il semble que, pour iOS7 la barre de recherche est incluse dans une vue parent.
Espérons que cela aide quelqu'un.
b
OriginalL'auteur bret
Vous pouvez sous-classe UISearchBar et écrire votre propre
- (void)layoutSubviews
méthode. Dans cette méthode, en boucle par le biais de son sous-vues et obtenir le cancelButton. Le reste doit être simple.Primordial -(void)layoutSubviews ne fonctionne que si le UISearchBar de la propriété showsCancelButton est définie sur OUI. Par défaut, cette valeur est définie sur NON et, par conséquent, le bouton annuler n'apparaît qu'une fois la UISearchBar textfield est touché. Dans ce cas primordial layoutSubviews aurait aucun effet.
OriginalL'auteur tilo
Vous pouvez profiter de l'iOS d'Exécution Propriété
_cancelButton
pour atteindre cet objectif.Impossible de modifier UISearchBar bouton annuler couleur du titre après modification du texte.
OriginalL'auteur Burhanuddin Sunelwala
KVC
UIButton *bouton = [_searchBar valueForKey:@"_cancelButton"];
bouton.titleLabel.font = [UIFont systemFontOfSize:13];
Donc, u pouvez modifier la police, u peut également modifier la titleColor. [bouton setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
OriginalL'auteur fengbai