Modifier la taille de la police de UISearchBar
-
11-10-2019 - |
Question
Comment puis-je changer la taille de la police UISearchBar
?
Edit: 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
La solution
Le UISearchBar a l'intérieur UITextField, mais il n'y a pas de propriété pour y accéder. Donc, il n'y a aucun moyen pour ce faire d'une manière standard.
Mais il y a un moyen non-stardard pour contourner ce. UISearchBar hérite de UIView, vous pouvez accéder à des sous-vues de l'aide [SearchBar subviews]. Si vous imprimez dans la console de subviews, vous verrez que ces vues ont.
UISearchBarBackground, UISearchBarTextField.
Alors, pour changer la taille de police que vous aurez seulement besoin de le faire
UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];
Mais, si le UISearchBar change à l'avenir et le champ de texte ne sont pas en position 1 plus, votre programme se bloque, il est donc préférable de vérifier à travers les sous-vues la position du UITextField puis définissez la taille de la police.
Autres conseils
Je suggère encore une autre option pour iOS 5.0 et plus:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];
pour iOS 8 (comme lié par Mike Gledhill):
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
}];
pour iOS et 9 ci-dessus:
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];
De cette façon, vous n'avez pas besoin de jouer avec pour chaque subviews énumération barre de recherche dans votre application.
Le moyen sûr pour effectuer cette opération est la suivante:
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'elle ne repose pas sur l'indice de la constante restant UITextField. (Il est aussi un produit de nettoyage pour la boucle)
La réponse acceptée n'est pas la méthode recommandée pour l'application de la police pour 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. Afin d'appliquer cette approche à une barre de recherche en particulier: créer une sous-classe de UISearchBar
et régler la defaultTextAttributes
sur la 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 (codage valeur-clé) 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]];
rapide 2.0 pour une barre de recherche créé, vous pouvez le faire programatically:
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 il fonctionnera dans d'autres endroits aussi (à savoir viewWillAppear du UIViewController)
Dans rapide 3, vous pouvez y parvenir en:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
Apparence UITextField
ne fonctionne pas pour UISearchBar
s créé un 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];
}
}
Vous ne devriez pas utiliser l'API privée comme dans d'autres réponses. Si vous souhaitez personnaliser les barres de recherche dans l'application entière, vous pouvez utiliser le proxy de l'apparence de la classe. Il permet de modifier les attributs de texte recherche de barre, les attributs d'espace réservé, bouton d'annulation, champ texte l'image d'arrière-plan, l'image d'arrière-plan, etc. Exemple d'utilisation:
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"
}
Je voulais utiliser « Roboto-Regular » comme police par défaut pour tous les uisearchbars dans 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!
}
}
Utilisation:
self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)
solution récursive de Réécriture Eugene dans rapide - a changé le nom de la fonction pour décrire plus précisément la fonction. Pour mon cas, je avais besoin de changer la taille des caractères. 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)
}
}
Essayez de trouver la barre de recherche par sa clé:
UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
le code complet doit être inférieur à:
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;
}
}
Ajouter ci-dessous le code où vous définissez ou la configuration de votre 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]];
Pour Swift 4.2 +
let defaultTextAttributes = [
NSAttributedString.Key.font: UIFont.init(name: "Ubuntu-Regular", size: 16),
NSAttributedString.Key.foregroundColor: UIColor.gray
]
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttributes