如何在 UISearchBar 中更改 PlaceHolder 的文本颜色?(iOS 13)

Fun*_*uni 6 uitextfield uisearchbar ios swift ios13

寻找更新(经过iOS的13)的回答,我没有找到这个简单问题的任何解决方案:

如何更改textColor占位符的一个UISearchBar

我的应用程序不处理Light/Dark模式。我不希望系统更改我的UIPlaceHolder文本颜色。我希望它总是white


    if #available(iOS 13.0, *) {
        let attrString = NSMutableAttributedString(string: "My PlaceHolder")
        attrString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], range: NSRange(location: 0, length: attrString.length))
        searchController.searchBar.searchTextField.attributedPlaceholder = attrString
    }
Run Code Online (Sandbox Code Playgroud)

我希望这段代码可以工作。我认为新属性searchTextField会使自定义我的UISearchBar.

编辑:

这种代码在viewDidAppear方法中有效:

if #available(iOS 13.0, *) {
     searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString(string: "My PlaceHolder", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white.withAlphaComponent(0.80)])
 }
Run Code Online (Sandbox Code Playgroud)

问题是当您上下滚动时颜色会发生变化。

Dej*_*dar 3

正如您已经提到的,您的代码仅适用于viewDidAppear,这使得占位符从默认灰色闪烁到首选颜色。

然而,之前似乎有一段时间viewDidAppear(我无法弄清楚确切的时间),在视图实际出现之前更改占位符。

我想,这可能与 iOS 处理浅色/深色模式的方式和/或 iOS 错误有关。

我提出的解决方案可以解决该问题:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if #available(iOS 13.0, *) {
        let placeholder = NSAttributedString(string: "Search",
                                             attributes: [
                                                .foregroundColor: UIColor.white
        ])
        let searchTextField = searchBar.searchTextField

        // Key workaround to be able to set attributedPlaceholder
        DispatchQueue.global().async {
            DispatchQueue.main.async {
                searchTextField.attributedPlaceholder = placeholder
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法似乎没有性能和/或其他缺点。

如果其他人有更好的方法,请随意合作。