2011-01-15 5 views
35

Как изменить размер шрифта 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]]; 
    } 

Благодаря
Панкай

+0

Проверьте этот вопрос: http://stackoverflow.com/questions/19161652/change-the-font-size-and-font-style-of-uisearchbar-ios-7 –

ответ

12

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

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

UISearchBarBackground, UISearchBarTextField.

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

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

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

+0

спасибо, что он сработал отлично ... я немного отредактировал ваш код и разместил его здесь как edit – pankaj

+3

downvoted, потому что он небезопасен и рекомендуется. Лучше предпочитайте @ josema.vitaminew ответ – skornos

15

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

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

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

+0

Единственный способ, которым этот код мог бы сломаться в будущем обновлении, - это если панель поиска перестает иметь 'UITextField' как подпункт. Но даже тогда это не потерпит крах. –

+2

Не работает в iOS 8, потому что изменилась иерархия представлений. Текстовое поле больше не находится на верхнем уровне. Поскольку ваш поиск не является рекурсивным, он не найдет текстовое поле. – Pwner

143

я предложить еще другой вариант для прошивки 5.0 и выше:

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

для IOS-8 (как связанно Mike Gledhill):

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

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

+5

Это правильный ответ с использованием API-интерфейсов Apple! Игнорируйте все, что рекомендуется здесь. – Yariv

+7

Это не работает. Для того, чтобы прокси-сервер внешнего вида работал для определенного класса/метода, для этого метода для заголовка файла класса требуется UI_APPEARANCE_SELECTOR. Если вы откроете UITextField, вы заметите, что у него нет аннотаций UI_APPEARANCE_SELECTOR. –

+0

Ну, это, безусловно, работает, думал, что это правда, что UITextField не объявляет эту аннотацию.Возможно, они забыли добавить аннотацию; он должен быть там в любом случае. –

0

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

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

Это может привести к тому, что ваше приложение будет отклонено, так как вы получаете доступ к частной собственности. Apple docs специально говорит, что это запрещено. –

0

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

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

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

В общем, это лучшее решение. Это не зависит от версии, поскольку внутреннее текстовое поле действительно является «UITextField» (или подклассом) и где-то в иерархии subview. Я не понимаю, почему вы используете UIAppearance. Почему бы просто не установить свойства напрямую? – Dima

+0

@Dima Я использую 'UIAppearance', потому что сначала устанавливаю значения font и textColor через внешний прокси-сервер, но он не подбирается системой при создании вашей панели поиска программно, поэтому я использую это обходное решение + значения от внешнего вида, так что, если я решит изменить ценности в будущем, они будут меняться повсюду в приложении. – Eugene

1

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

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

Вы можете использовать KVC (ключ-значение кодирования), чтобы получить текстовое поле

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

Это должен быть принятый ответ. –

+1

, что опасно для будущего – Hassy

+1

Это действительно Хасси. Риск, но он работает уже пару лет. Некоторые приложения даже не живут так долго. Если вы используете это решение, просто убедитесь, что вы тестируете его перед каждой версией новой iOS. –

10

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

override func layoutSubviews() { 
    super.layoutSubviews() 

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

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

2

Я хотел использовать «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) 
5

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

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

Не работает для меня – mxcl

+0

Это сработало для меня. Просто автозаполнение кода не срабатывало при попытке .font –

1

Вы не должны использовать частный 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" 
} 
5

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