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

Était-ce utile?

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 UISearchBars 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top