在Swift中更改搜索栏占位文本字体

25
我试图改变Search Display Controller中搜索栏占位文本的字体。我查看了一些示例并尝试实现它们,但由于它们是Objective-C编写,我无法找到任何一个能够正常工作的示例。
例如,我尝试了这个示例:
UITextField *textField = [[searchBar subviews] objectAtIndex:1]; 
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];

但我无法理解var textField: UITextField = UISearchBar

你有什么建议吗?

9个回答

34
 //SearchBar Text
    let textFieldInsideUISearchBar = dashBoardSearchBar.valueForKey("searchField") as? UITextField
textFieldInsideUISearchBar?.textColor = UIColor.whiteColor()

//SearchBar Placeholder    
     let textFieldInsideUISearchBarLabel = textFieldInsideUISearchBar!.valueForKey("placeholderLabel") as? UILabel
textFieldInsideUISearchBarLabel?.textColor = UIColor.whiteColor()

2
“placeholderLabel” 在 iOS10 中似乎不再起作用了,但是更改“searchField”的字体会同时更改占位符字体和文本字体。 - Daniel

22

设置占位符文本字体大小:

UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.systemFont(ofSize: 12)

设置搜索文本字体大小:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.systemFont(ofSize: 12)

15
searchBar.searchTextField.font = UIFont(name: "Helvetica", size: 40)

2
你好,欢迎来到Stack Overflow!当你回答一个问题时,应该包含一些解释,比如作者做错了什么以及你是如何修复的。我告诉你这个原因是因为你的答案被标记为低质量并正在接受审核。你可以通过点击“编辑”按钮来[编辑]你的答案。 - Federico Grandi
1
这仅适用于iOS 13及以上版本。 - Starman

15

这是在搜索栏的文本字段中更改字体或任何其他类似更改的最简单练习。

我一直在使用XCode 8.4,Swift 3.x,iOS 10.x。
extension UISearchBar {

func change(textFont : UIFont?) {

    for view : UIView in (self.subviews[0]).subviews {

        if let textField = view as? UITextField {
            textField.font = textFont
        }
    }
} }

以上代码可以直接在您创建searchBar的IBOutlet位置调用...

@IBOutlet weak var searchBar: UISearchBar! {
    didSet {
        searchBar.change(textFont: GlobalConstants.Font.avenirBook14)
    }
}

1
它不起作用;它只是以非常简单的方式工作,如下所示: searchBar.searchTextField.font = UIFont(name: "Helvetica", size: 40)在XCode:11.3 OS:13.3上测试过。 - msmq

9

Swift 5 中,甚至还有一种更简单的方法:

searchBar[keyPath: \.searchTextField].font = UIFont(...)

有趣的语法! - Vitya Shurapov
1
表达式的类型缺乏更多上下文是不明确的。 - Markon
@Markon 你在使用 Swift 5 吗?也许有其他问题,但 Xcode 只是错误地显示了这一行?或者尝试清除构建。 - ramzesenok

8

在iOS 8中,尝试这样做:

for subView in searchBar.subviews  {
  for subsubView in subView.subviews  {
      if let textField = subsubView as? UITextField {
        textField.attributedPlaceholder =  NSAttributedString(string:NSLocalizedString("Search", comment:""),
          attributes:[NSForegroundColorAttributeName: UIColor.orangeColor()])
      }
  }
}

7

@Alvin的答案的Swift 3版本:

let textFieldInsideUISearchBar = searchBar.value(forKey: "searchField") as? UITextField
    let placeholderLabel       = textFieldInsideUISearchBar?.value(forKey: "placeholderLabel") as? UILabel
    placeholderLabel?.font     = UIFont.systemFont(ofSize: 12.0)

1
如果有人也在努力让这个工作起来,如果你正在使用故事板,你需要在故事板的搜索栏上设置一个占位符值,然后再使用这段代码。 - Leonardo
我之前使用了一个searchController而不是一个searchBar,所以在使用... = searchBar.value...的地方,我使用了... = searchController.searchBar.value...。区别在于直接使用searchController时,searchBar是它的一个属性,因此您必须先通过searchBar才能访问它。 - Lance Samaria

3

这段代码完全适用于ios7 -> ios9,使用swift 2:

if #available(iOS 9.0, *) {
    UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).font = UI.getInstance.tinyFont
} else {
    func checkSubview(view:UIView)
    for subView in view.subviews {
        if subView is UITextField {
            let textField = subView as! UITextField
            textField.font = UI.getInstance.tinyFont
        } else {
            checkSubview(subView)
        }

    }
    checkSubview(view)
}

只需将UI.getInstance.tinyFont替换为您想要的任何字体即可。


0
let searchBar = UISearchBar()

guard let font = UIFont(name: "Helvetica", size: 40.0) else { return }

let attributedString = NSAttributedString(
    string: "Search...",
    attributes: [
        .font: font
    ]
)

searchBar.searchTextField.attributedPlaceholder = attributedString

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接