我如何改变 UISearchBar
的文本颜色?
您需要访问UISearchBar内部的UITextField
。 您可以使用valueForKey("searchField")
来实现。
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift 3更新
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchController.searchBar.barStyle = .black
对我来说,使用Swift 4很顺畅:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]
Swift 4.2,IOS 12:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { $0.subviews }
guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
这对于我在iOS 11和Xcode 9上运行有效:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
我把它写在AppDelegate
中,但我想如果你把它放在其他地方也可以运行。
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
当然,这是Objective-C,可以使用 appearance(whenContainedInInstancesOf:)
进行明显的Swift翻译。 - RobPUISearchBar
内部有一个 UITextField
的相同黑客。但是,与其将丑陋的本地化放在使用的地方,不如将其全部泼洒在整个项目中。 - Zapko我认为最方便的方法是在UISearchBar
中设置textColor
属性。
Swift 3.0
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.value(forKey: "searchField") as?
UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.value(forKey: "searchField") as?
UITextField {
textField.textColor = newValue
}
}
}
}
使用方法
searchBar.textColor = UIColor.blue // Your color
Swift 2.3
extension UISearchBar {
var textColor:UIColor? {
get {
if let textField = self.valueForKey("searchField") as? UITextField {
return textField.textColor
} else {
return nil
}
}
set (newValue) {
if let textField = self.valueForKey("searchField") as? UITextField {
textField.textColor = newValue
}
}
}
}
你可以这样使用它:
searchBar.textColor = UIColor.blueColor() // Your color
自从 Xcode 11 和 iOS 13 推出以来,直接访问文本字段已成为可能:
searchBar.searchTextField
您可以编写一些代码,始终使其像这样易于访问。
extension UISearchBar {
public var textField: UITextField? {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
assertionFailure("Could not find text field")
return nil
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
assertionFailure("Could not find text field")
return nil
}
}
你也可以使用致命错误让它变得不可选,这段代码从iOS 7测试到iOS 13GM都是可行的。但我建议仍然采用可选版本。
extension UISearchBar {
public var textField: UITextField {
if #available(iOS 13.0, *) {
return searchTextField
}
guard let firstSubview = subviews.first else {
fatalError("Could not find text field")
}
for view in firstSubview.subviews {
if let textView = view as? UITextField {
return textView
}
}
fatalError("Could not find text field")
}
}
试一下这个:
searchBar.searchTextField.textColor = .white
我尝试了上面写的几种解决方案,但它们没有起作用(我猜可能是因为已经过时了)。
如果你只想处理iOS 13:
mySearchBar.searchTextField.textColor = .red
但是如果你也想处理旧版的iOS,这是我所做的方法:
创建一个自定义的UISearchBar
类,称为SearchBar: UISearchBar, UISearchBarDelegate
。这个SearchBar
将具有我想要处理的UISearchBarDelegate
方法和它的delegate
设置。
然后我添加到这个类中:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
简要说明:
现在使用 iOS13 可以通过 UISearchBar.searchTextField
来访问 UITextField
,它是一个类型为 UISearchTextField
的子类,而 UISearchTextField
继承自 UITextField
。
由于我知道我的层次结构,我知道旧版本中我的 textField
不会为空,所以在两种情况下,我都可以获得一个可以轻松自定义的文本字段,在今天从 9 到 13 的每个版本上都可以工作。
以下为使其正常工作所需的完整代码:
class SearchBar: UISearchBar, UISearchBarDelegate {
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
}
override func awakeFromNib() {
super.awakeFromNib()
delegate = self
if let textField = textField {
textField.textColor = .red
textField.clearButtonMode = .whileEditing
textField.returnKeyType = .search
}
}
}
您还可以通过在以下位置添加以下信息来对SearchBar
进行一些自定义设置:
let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
searchBar.backgroundImage = UIImage()
searchBar.isTranslucent = false
searchBar.returnKeyType = .search
然后您将其设置为XIB /故事板,并像处理简单的UISearchBar
一样处理它(如果您没有忘记委托!)。
searchField
。 - Greg Brown