Изменить размер шрифта UISearchBar - PullRequest
44 голосов
/ 15 января 2011

Как мне изменить размер шрифта UISearchBar?

Редактировать:
Ответ

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]];
    }

Спасибо
Pankaj

Ответы [ 14 ]

151 голосов
/ 18 января 2013

Я предлагаю еще один вариант для iOS 5.0 и выше:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];

для iOS 8 (по сообщению Майка Гледхилла):

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
            NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
      }];

для iOS 9 и выше:

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];

Таким образом вам не нужно возиться с перечислением подпредставлений для каждой панели поиска в вашем приложении.

17 голосов
/ 25 сентября 2012

Безопасный способ выполнения этой операции заключается в следующем:

for(UIView *subView in searchBar.subviews) {
    if ([subView isKindOfClass:[UITextField class]]) {
        UITextField *searchField = (UITextField *)subView;
        searchField.font = [UIFont fontWithName:@"Oswald" size:11];
    }
}

Почему это безопаснее, чем принятый ответ?Потому что он не зависит от того, остается ли индекс UITextField постоянным.(это также очиститель для петли)

15 голосов
/ 15 января 2011

UISearchBar имеет UITextField внутри, но нет свойства для доступа к нему. Таким образом, нет способа сделать это стандартным способом.

Но есть нестандартный способ обойти это. UISearchBar наследует от UIView, вы можете получить доступ к его подпредставлениям, используя [searchBar subviews]. Если вы напечатаете в консоли его подпредставления, вы увидите, что оно имеет эти представления.

UISearchBarBackground, UISearchBarTextField.

Итак, чтобы изменить размер шрифта, вам нужно всего лишь сделать это

    UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];

Но, если UISearchBar изменится в будущем и текстовое поле больше не будет в позиции 1, ваша программа потерпит крах, поэтому лучше проверить через подпредставления позицию UITextField и затем установить размер шрифта.

13 голосов
/ 10 октября 2017

Принятый ответ не является рекомендуемым способом применения шрифта для UISearchBar. Лучше избегать такого подхода и использовать ответы, предоставленные @rafalkitta или @josema.

Но будьте осторожны, это будет применяться ко всем панелям поиска во всем приложении. Чтобы применить этот подход к определенной строке поиска: создайте подкласс UISearchBar и установите defaultTextAttributes на UITextField, как показано ниже

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 голосов
/ 08 января 2015

Вы можете использовать KVC (Key-Value Coding), чтобы получить текстовое поле

UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
11 голосов
/ 16 октября 2015

В Swift 2.0 для панели поиска, созданной программно, вы можете сделать это:

override func layoutSubviews() {
  super.layoutSubviews()

  let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
  textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
 }

В этом случае я помещаю код в подкласс UIView, но он будет работать и в других местах (например, viewWillAppear из UIViewController)

8 голосов
/ 13 января 2017

В Swift 3 вы можете достичь этого:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
5 голосов
/ 15 февраля 2014

UITextField внешний вид не работает для UISearchBar с, созданных программно. Вы должны использовать рекурсивный обходной путь

- (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];
  }
}
4 голосов
/ 07 апреля 2017

Вы не должны использовать приватный API, как в других ответах.Если вы хотите настроить панели поиска во всем приложении, вы можете использовать внешний вид прокси класса.Позволяет изменять текстовые атрибуты панели поиска, атрибуты заполнителя, кнопку отмены, фоновое изображение текстового поля, фоновое изображение и т. Д.

3 голосов
/ 27 мая 2016

Я хотел использовать Roboto-Regular в качестве шрифта по умолчанию для всех панелей пользователей в моем проекте. Я сделал расширение панели пользователя.

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!
}
}

Использование:

self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)
...