如何更改 UISearchBar 搜索文本颜色?
How can I change the UISearchBar search text color?
如何更改 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
如果你想在故事板中为 UISearchBar 设置文本颜色(无需代码),也很容易做到(在身份检查器中)。这是搜索栏的红色文本。
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { [=10=].subviews }
guard let tf = (svs.filter { [=10=] is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
您可以通过访问搜索栏内的 UITextField 来执行此操作,
然后您可以更改其背景颜色、文本颜色和所有其他 UITextField 属性
添加以下扩展以访问文本字段
extension UISearchBar {
/// Return text field inside a search bar
var textField: UITextField? {
let subViews = subviews.flatMap { [=10=].subviews }
guard let textField = (subViews.filter { [=10=] is UITextField }).first as? UITextField else { return nil
}
return textField
}
}
我认为最方便的方法是在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
这对我适用 iOS 11,Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
我把它写在 AppDelegate
但我想如果你把它也放在其他地方它会起作用。
如果您只需要使其在深色背景下可读,您可以更改 barStyle。以下内容使搜索栏中的文本和按钮变为白色:
searchController.searchBar.barStyle = .black
在我的情况下解决方案是
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
我在 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]
(此解决方案仅针对 Xcode 10 和 iOS 12 进行了测试。)添加扩展以访问搜索栏的文本字段:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { [=10=] as? UITextField }.first
}
}
然后使用 属性 设置搜索栏中文本字段的文本颜色:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// 编辑
上面的代码不适用于 iOS 13。处理这个问题的更好方法是使用:
extension UISearchBar {
var textField: UITextField? {
return self.subviews(ofType: UITextField.self).first
}
}
extension UIView {
var recursiveSubviews: [UIView] {
return self.subviews + self.subviews.flatMap { [=12=].recursiveSubviews }
}
func subviews<T: UIView>(ofType: T.Type) -> [T] {
return self.recursiveSubviews.compactMap { [=12=] as? T }
}
}
这里是 Xamarin.iOS C# 版本的 "find the UITextField" 方法。如果 UITextField 在未来 iOS 视图层次结构中消失,它不会崩溃。
var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null)
(tf as UITextField).TextColor = UIColor.White;
public static IEnumerable<UIView> AllSubViews(this UIView view)
{
foreach (var v in view.Subviews)
{
yield return v;
foreach (var sv in v.AllSubViews())
{
yield return sv;
}
}
}
从 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")
}
}
Obj-C
UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];
Swift 4.x
let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red
我尝试了上面写的一些解决方案,但它们没有用(我猜是)。
如果你只想处理iOS13:
mySearchBar.searchTextField.textColor = .red
但是如果你也想处理旧的 iOS,我就是这样做的:
创建自定义 UISearchBar
class,名为 SearchBar : UISearchBar, UISearchBarDelegate
此 SearchBar
将具有我想要处理的 UISearchBarDelegate
方法及其 delegate
集。
然后我添加到 class:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { [=10=] as? UITextField != nil }) as? UITextField
}
简短说明:
现在使用 iOS13,您可以访问 UITextField
感谢 UISearchBar.searchTextField
,它是 UISearchTextField
类型,继承自 UITextField
。
因为我知道我的层次结构,我知道我的 textField
不会是旧版本的 nill
所以在这两种情况下,我都有一个可以轻松自定义的文本字段,适用于每个版本,今天 9 点到 13 点。
这是让它工作所需的完整代码:
class SearchBar: UISearchBar, UISearchBarDelegate {
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { [=11=] 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 / Storyboard,然后将其处理为简单的 UISearchBar
(如果您没有忘记代表!)。
//试试这个人
yourSearchbar.searchTextField.textColor = .white
试试这个,
searchBar.searchTextField.textColor = .white
我正在将此应用与目标 iOS 11 以后的应用一起使用。
[更新]
我观察到,该应用程序在旧版本 (< iOS 13) 上崩溃,但编译器从未抱怨过版本检查,有人请解释为什么会这样。
Swift 5.2 & iOS 13.3.1:-
它工作正常。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
Swift 5 Xcode 11.4 iOS 13.4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
在 Swift 5 中,您可以执行以下操作:
yourSearchBar.searchTextField.textColor = .yourColor
这对我有用。
if #available(iOS 13.0, *) {
searchBar.searchTextField.textColor = .white
}
您可以为self.searchBar.searchTextField.textColor设置颜色
viewDidLoad 中的以下代码有效。
- (void)viewDidLoad {
[super viewDidLoad];
self.searchBar.searchTextField.textColor = [UIColor whiteColor];
}
SwiftUI,Swift5
在SwiftUI中,
init(){
UITextfiled.appearance().textColor = .white
}
不起作用。但是你可以只使用
.foregroundColor(.white)
用于更改 searchable() 的文本颜色的修饰符。
如果您还想更改 NavigationView 中搜索栏的 tintColor{}。您可以初始化视图的 inti() 函数。
init(){
UINavigationBar.appearance().tintColor = .white
}
var body:some View{
NavigationView{
}
}
如何更改 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
如果你想在故事板中为 UISearchBar 设置文本颜色(无需代码),也很容易做到(在身份检查器中)。这是搜索栏的红色文本。
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { [=10=].subviews }
guard let tf = (svs.filter { [=10=] is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
您可以通过访问搜索栏内的 UITextField 来执行此操作, 然后您可以更改其背景颜色、文本颜色和所有其他 UITextField 属性
添加以下扩展以访问文本字段
extension UISearchBar {
/// Return text field inside a search bar
var textField: UITextField? {
let subViews = subviews.flatMap { [=10=].subviews }
guard let textField = (subViews.filter { [=10=] is UITextField }).first as? UITextField else { return nil
}
return textField
}
}
我认为最方便的方法是在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
这对我适用 iOS 11,Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
我把它写在 AppDelegate
但我想如果你把它也放在其他地方它会起作用。
如果您只需要使其在深色背景下可读,您可以更改 barStyle。以下内容使搜索栏中的文本和按钮变为白色:
searchController.searchBar.barStyle = .black
在我的情况下解决方案是
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
我在 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]
(此解决方案仅针对 Xcode 10 和 iOS 12 进行了测试。)添加扩展以访问搜索栏的文本字段:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { [=10=] as? UITextField }.first
}
}
然后使用 属性 设置搜索栏中文本字段的文本颜色:
let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want
// 编辑
上面的代码不适用于 iOS 13。处理这个问题的更好方法是使用:
extension UISearchBar {
var textField: UITextField? {
return self.subviews(ofType: UITextField.self).first
}
}
extension UIView {
var recursiveSubviews: [UIView] {
return self.subviews + self.subviews.flatMap { [=12=].recursiveSubviews }
}
func subviews<T: UIView>(ofType: T.Type) -> [T] {
return self.recursiveSubviews.compactMap { [=12=] as? T }
}
}
这里是 Xamarin.iOS C# 版本的 "find the UITextField" 方法。如果 UITextField 在未来 iOS 视图层次结构中消失,它不会崩溃。
var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null)
(tf as UITextField).TextColor = UIColor.White;
public static IEnumerable<UIView> AllSubViews(this UIView view)
{
foreach (var v in view.Subviews)
{
yield return v;
foreach (var sv in v.AllSubViews())
{
yield return sv;
}
}
}
从 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")
}
}
Obj-C
UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];
Swift 4.x
let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red
我尝试了上面写的一些解决方案,但它们没有用(我猜是)。
如果你只想处理iOS13:
mySearchBar.searchTextField.textColor = .red
但是如果你也想处理旧的 iOS,我就是这样做的:
创建自定义 UISearchBar
class,名为 SearchBar : UISearchBar, UISearchBarDelegate
此 SearchBar
将具有我想要处理的 UISearchBarDelegate
方法及其 delegate
集。
然后我添加到 class:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { [=10=] as? UITextField != nil }) as? UITextField
}
简短说明:
现在使用 iOS13,您可以访问 UITextField
感谢 UISearchBar.searchTextField
,它是 UISearchTextField
类型,继承自 UITextField
。
因为我知道我的层次结构,我知道我的 textField
不会是旧版本的 nill
所以在这两种情况下,我都有一个可以轻松自定义的文本字段,适用于每个版本,今天 9 点到 13 点。
这是让它工作所需的完整代码:
class SearchBar: UISearchBar, UISearchBarDelegate {
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { [=11=] 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 / Storyboard,然后将其处理为简单的 UISearchBar
(如果您没有忘记代表!)。
//试试这个人
yourSearchbar.searchTextField.textColor = .white
试试这个,
searchBar.searchTextField.textColor = .white
我正在将此应用与目标 iOS 11 以后的应用一起使用。
[更新] 我观察到,该应用程序在旧版本 (< iOS 13) 上崩溃,但编译器从未抱怨过版本检查,有人请解释为什么会这样。
Swift 5.2 & iOS 13.3.1:-
它工作正常。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
Swift 5 Xcode 11.4 iOS 13.4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
在 Swift 5 中,您可以执行以下操作:
yourSearchBar.searchTextField.textColor = .yourColor
这对我有用。
if #available(iOS 13.0, *) {
searchBar.searchTextField.textColor = .white
}
您可以为self.searchBar.searchTextField.textColor设置颜色 viewDidLoad 中的以下代码有效。
- (void)viewDidLoad {
[super viewDidLoad];
self.searchBar.searchTextField.textColor = [UIColor whiteColor];
}
SwiftUI,Swift5
在SwiftUI中,
init(){
UITextfiled.appearance().textColor = .white
}
不起作用。但是你可以只使用
.foregroundColor(.white)
用于更改 searchable() 的文本颜色的修饰符。
如果您还想更改 NavigationView 中搜索栏的 tintColor{}。您可以初始化视图的 inti() 函数。
init(){
UINavigationBar.appearance().tintColor = .white
}
var body:some View{
NavigationView{
}
}