Изменить размер шрифта 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]];
}
Спасибо
Панкай
Ответы
Ответ 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