如何更改 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, UISearchBarDelegateSearchBar 将具有我想要处理的 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{
   
   }
}