Подтвердить что ты не робот

Изменить размер шрифта UISearchBar

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

Edit:
Ответ

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

Спасибо
Панкай

4b9b3361

Ответ 1

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

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

UISearchBarBackground, UISearchBarTextField.

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

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

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

Ответ 2

Я предлагаю еще один вариант для 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]}];

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

Ответ 3

Безопасный способ выполнения этой операции:

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

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

Ответ 4

Принятый ответ не является рекомендуемым способом применения шрифта для 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;

Ответ 5

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

UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];

Ответ 6

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

override func layoutSubviews() {
  super.layoutSubviews()

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Я хотел использовать "Roboto-Regular" в качестве шрифта по умолчанию для всех uisearchbars в моем проекте. Я сделал расширение 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!
}
}

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

self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)

Ответ 11

Переписал Евгений рекурсивное решение в swift - изменил имя функции, чтобы более точно описать функцию. Для моего случая мне нужно было изменить размер шрифта. Это сработало для меня.

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

Ответ 12

Попробуйте найти строку поиска по ее ключу:

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

Ответ 13

полный код должен быть ниже:

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

Ответ 14

Добавьте ниже код, где вы определяете или настраиваете свой 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)

Цель 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]];

Ответ 15

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

Ответ 16

Для 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