更改UISearchBar的字体大小

pan*_*kaj 46 objective-c uisearchbar uifont ios

如何更改字体大小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]];
    }
Run Code Online (Sandbox Code Playgroud)

谢谢
Pankaj

jos*_*new 157

我建议iOS 5.0及更高版本有不同的选择:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];
Run Code Online (Sandbox Code Playgroud)

适用于iOS 8(由Mike Gledhill链接):

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
            NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
      }];
Run Code Online (Sandbox Code Playgroud)

适用于iOS 9及更高版本:

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];
Run Code Online (Sandbox Code Playgroud)

这样,您就不需要为应用中的每个搜索栏枚举子视图.

  • 这不起作用.要使外观代理适用于特定的类/方法,类头文件需要该方法的UI_APPEARANCE_SELECTOR.如果您打开UITextField,您会注意到它没有任何UI_APPEARANCE_SELECTOR注释. (7认同)
  • 这是使用Apple API的正确答案!忽略此处推荐的任何其他内容. (5认同)
  • 当我在声明UISearchBar并将其以编程方式添加到表视图之后放置行*时,这对我有用.如果是事先它没有做任何事情.如果您通过Interface Builder添加搜索,我不确定它是如何工作的. (3认同)

Gav*_*ler 19

执行此操作的安全方法如下:

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

为什么这比接受的答案更安全?因为它不依赖于UITextField的索引保持不变.(它也是循环清洁器)

  • 在iOS 8中不起作用,因为视图层次结构已更改.文本字段不再位于顶层.由于您的搜索不是递归的,因此无法找到文本字段. (3认同)

Bru*_*ues 16

UISearchBar里面有一个UITextField,但没有属性可以访问它.所以,没有办法以标准的方式做到这一点.

但是有一种非标准的解决方法.UISearchBar继承自UIView,您可以使用[searchBar subviews]访问它的子视图.如果您在控制台中打印它的子视图,您将看到它具有这些视图.

UISearchBarBackground,UISearchBarTextField.

因此,要更改字体大小,您只需要这样做

    UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];
Run Code Online (Sandbox Code Playgroud)

但是,如果UISearchBar在将来发生变化且文本字段不再位于位置1,则程序将崩溃,因此最好通过子视图检查UITextField的位置,然后设置字体大小.

  • downvoted,因为它不安全和推荐的方式.更喜欢@ josema.vitaminew的答案 (6认同)

Ris*_*shi 15

接受的答案不是UISearchBar应用字体的推荐方法.最好避免这种方法,并使用@rafalkitta或@josema提供的答案.

但要小心,这将通过应用程序应用于所有搜索栏.为了将此方法应用于特定搜索栏:创建一个子类UISearchBardefaultTextAttributesUITextField下面设置类似

Swift4:

    let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.boldSystemFont(ofSize: 21.0), NSAttributedStringKey.foregroundColor.rawValue:UIColor.red]
    UITextField.appearance(whenContainedInInstancesOf: [CustomSearchBar.self]).defaultTextAttributes = defaultTextAttribs
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)


Adr*_*oni 12

您可以使用KVC(键值编码)来获取文本字段

UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
Run Code Online (Sandbox Code Playgroud)


Cip*_*rau 11

在swift 2.0中,以编程方式创建的搜索栏可以执行以下操作:

override func layoutSubviews() {
  super.layoutSubviews()

  let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
  textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
 }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将代码放在UIView子类中,但它也可以在其他地方工作(即来自UIViewController的viewWillAppear)


Ash*_*ldr 9

在swift 3中,您可以通过以下方式实现此目的:

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


Eug*_*ene 5

UITextField外观不适用于UISearchBar以编程方式创建的s.您必须使用递归的解决方法

- (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];
  }
}
Run Code Online (Sandbox Code Playgroud)


raf*_*tta 5

您不应该像其他答案一样使用私有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"
}
Run Code Online (Sandbox Code Playgroud)