Comment puis-je changer la taille de la police de UISearchBar
?
Modifier:
Réponse
for(int i =0; i<[searchbar.subviews count]; i++) {
if([[searchbar.subviews objectAtIndex:i] isKindOfClass:[UITextField class]])
[(UITextField*)[searchbar.subviews objectAtIndex:i] setFont:[UIFont fontWithName:@"Helvetica" size:12]];
}
Merci
Pankaj
UISearchBar a un UITextField à l'intérieur, mais il n'y a pas de propriété pour y accéder. Donc, il n'y a aucun moyen de le faire de manière standard.
Mais il existe un moyen non standard de résoudre ce problème . UISearchBar hérite de UIView, vous pouvez accéder à ses sous-vues à l'aide de [searchBar subviews] . Si vous imprimez dans la console, vous verrez qu'il possède ces vues. .
UISearchBarBackground, UISearchBarTextField.
Donc, pour changer la taille de la police, il vous suffira de le faire.
UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];
Toutefois, si la barre UISearchBar change à l'avenir et que le champ de texte n'est plus à la position 1, votre programme se bloquera. Il est donc préférable de vérifier la position de UITextField dans les sous-vues, puis de définir la taille de la police.
Je suggère encore une option différente pour iOS 5.0 et plus:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];
pour iOS 8 (lié par Mike Gledhill):
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
}];
pour iOS 9 et supérieur:
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];
De cette façon, vous n'avez pas besoin de vous embêter à énumérer des sous-vues pour chaque barre de recherche de votre application.
Le moyen sûr d'effectuer cette opération est le suivant:
for(UIView *subView in searchBar.subviews) {
if ([subView isKindOfClass:[UITextField class]]) {
UITextField *searchField = (UITextField *)subView;
searchField.font = [UIFont fontWithName:@"Oswald" size:11];
}
}
Pourquoi est-ce plus sûr que la réponse acceptée? Parce qu'il ne repose pas sur l'index de UITextField en restant constant. (c'est aussi un nettoyant pour la boucle)
La réponse acceptée n'est pas la méthode recommandée pour appliquer la police à UISearchBar. Mieux vaut éviter cette approche et utiliser les réponses fournies par @rafalkitta ou @josema.
Mais soyez prudent, cela sera appliqué à toutes les barres de recherche à travers l'application. Pour appliquer cette approche à une barre de recherche particulière: créez une sous-classe de UISearchBar
et définissez defaultTextAttributes
sur UITextField
comme ci-dessous
Swift4 :
let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.boldSystemFont(ofSize: 21.0), NSAttributedStringKey.foregroundColor.rawValue:UIColor.red]
UITextField.appearance(whenContainedInInstancesOf: [CustomSearchBar.self]).defaultTextAttributes = defaultTextAttribs
Obj-C (iOS11)
UIFont *font = [UIFont boldSystemFontOfSize:21.0];
UIColor *color = [UIColor redColor];
NSDictionary * defaultTextAttribs = @{NSFontAttributeName:font, NSForegroundColorAttributeName: color};
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[CustomSearchBar class]]].defaultTextAttributes = defaultTextAttribs;
Vous pouvez utiliser KVC (Key-Value Coding) pour obtenir le champ de texte
UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
Dans Swift 2.0, pour une barre de recherche créée par programme, vous pouvez le faire:
override func layoutSubviews() {
super.layoutSubviews()
let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
}
Dans ce cas, je mets le code dans une sous-classe UIView, mais cela fonctionnera également ailleurs (par exemple, viewWillAppear à partir de UIViewController)
Dans Swift 3, vous pouvez y parvenir en:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
UITextField
apparence ne fonctionne pas pour UISearchBar
s créé par programme. Vous devez utiliser une solution de contournement récursive
- (void)viewDidLoad {
[super viewDidLoad];
[self recursivelySkinTextField:self.searchBar];
}
- (void)recursivelySkinTextField:(UIView *)view {
if (!view.subviews.count) return;
for (UIView *subview in view.subviews) {
if ([subview isKindOfClass:[UITextField class]]) {
UITextField *searchField = (UITextField *)subview;
searchField.font = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] font];
searchField.textColor = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] textColor];
}
[self recursivelySkinTextField:subview];
}
}
Je voulais utiliser «Roboto-Regular» comme police par défaut pour toutes les barres de recherche uisearch de mon projet. J'ai fait une extension uisearchbar.
extension UISearchBar {
func addRobotoFontToSearchBar(targetSearchBar:UISearchBar?) -> UISearchBar
{
let textFieldInsideSearchBar = targetSearchBar!.valueForKey("searchField") as! UITextField
textFieldInsideSearchBar.font = UIFont(name: "Roboto-Regular", size: 15.0)
//UIBarButtons font in searchbar
let uiBarButtonAttributes: NSDictionary = [NSFontAttributeName: UIFont(name: "Roboto-Regular", size: 15.0)!]
UIBarButtonItem.appearance().setTitleTextAttributes(uiBarButtonAttributes as? [String : AnyObject], forState: UIControlState.Normal)
return targetSearchBar!
}
}
Usage:
self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)
Vous ne devriez pas utiliser d'API privée comme dans d'autres réponses. Si vous souhaitez personnaliser les barres de recherche dans l’ensemble de l’application, vous pouvez utiliser le proxy d’apparence de la classe. Il permet de modifier les attributs de texte de la barre de recherche, les attributs d'espace réservé, le bouton d'annulation, l'image d'arrière-plan du champ de texte, l'image d'arrière-plan, etc.
if #available(iOS 9.0, *) {
let searchBarTextAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12),
NSForegroundColorAttributeName: UIColor.red
]
// Default attributes for search text
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = searchBarTextAttributes
// Attributed placeholder string
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "Search...", attributes: searchBarTextAttributes)
// Search bar cancel button
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(searchBarTextAttributes, for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Cancel"
}
Réécriture de la solution récursive d'Eugene dans Swift - modification du nom de la fonction pour une description plus précise de la fonction. Pour mon cas, je devais changer la taille de la police. Cela a fonctionné pour moi.
func findAndSetTextField(view: UIView)
{
if (view.subviews.count == 0)
{
return
}
for var i = 0; i < view.subviews.count; i++
{
var subview : UIView = view.subviews[i] as UIView
if (subview.isKindOfClass(UITextField))
{
var searchField : UITextField = subview as UITextField
searchField.font = UIFont(name: "Helvetica", size: 19.0)!
}
findAndSetTextField(subview)
}
}
le code complet devrait être ci-dessous:
for (UIView *v in (SYSTEM_VERSION_LESS_THAN(@"7.0")?searchBar.subviews:[[searchBar.subviews objectAtIndex:0] subviews])) {
if([v isKindOfClass:[UITextField class]]) {
UITextField *textField = (UITextField *)v;
[textField setFont:fREGULAR(@"15.0")];
return;
}
}
Essayez de trouver la barre de recherche par sa clé:
UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
Ajoutez le code ci-dessous où vous définissez ou configurez votre barre UISearchBar
Swift4:
UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)
Objectif c:
[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];