web-dev-qa-db-fra.com

Changer la taille de la police de UISearchBar

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

40
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.

14
Bruno Domingues

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.

148
josema.vitaminew

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)

16
Gavin Miller

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;
12
Rishi

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]];
12
Adriano Spadoni

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)

11
Ciprian Rarau

Dans Swift 3, vous pouvez y parvenir en: 

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
7
Ashildr

UITextField apparence ne fonctionne pas pour UISearchBars 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];
  }
}
5
Eugene

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)
3
A.G

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"
}
3
rafalkitta

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)
    }
}
2
epaus

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;
    }
}
1
Trong Dinh

Essayez de trouver la barre de recherche par sa clé:

UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
1
theprojectabot

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]];
0
Vinayak Pal