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

时间:2019-10-08 13:24:58

标签: ios swift uitextfield uisearchbar ios13

寻找更新后的( iOS 13 )答案后,我没有找到任何解决此简单问题的方法:

如何更改 {{1 }} 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 } 可以使自定义searchTextField的工作变得更加容易。

编辑:

这种代码类型可以在UISearchBar方法中起作用:

viewDidAppear

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

3 个答案:

答案 0 :(得分:2)

正如您已经提到的,您的代码仅在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

        // Very nasty hack to be able to set attributedPlaceholder
        // in iOS 13 without flickering
        DispatchQueue.global().async {
            for _ in 0...10 {
                usleep(30_000)
                DispatchQueue.main.async {
                    searchTextField.attributedPlaceholder = placeholder
                }
            }
        }
    }
}

此方法似乎没有性能和/或其他缺点,除了那真是令人讨厌...

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

答案 1 :(得分:0)

您可以使用UITextField appearance属性进行设置。检查这行代码

 UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

答案 2 :(得分:0)

我想它不起作用的原因可能是您得到的searchController.searchBar.searchTextField = nil

searchTextFieldiOS 13的新属性,如果仅支持>= iOS 13,则可以完成此操作。如果要适应iOS 13的先前版本,可以遍历UISearchBar来找到UISearchBarTextField,然后直接设置找到的UISearchBarTextField

我查找的代码可能是这样的,我将其放在Category的{​​{1}}中。

UIView

使用时,您可以自定义- (UIView *)findChildViewClass:(Class)childViewClass fromView:(UIView *)fromView{ for (UIView *subView in fromView.subviews) { if ([subView isMemberOfClass:childViewClass]) { return subView; } UIView *finalView = [self findChildViewClass:childViewClass fromView:subView]; if (finalView) { return finalView; }else{ continue; } } return nil; } 属性以从searchTextField继承以保存找到的值。

UITextField

这是我现在使用的,它正在工作,希望对您有用。