如何更改 UISearchBar 中 PlaceHolder 的文本颜色? (iOS 13)
How to change text color of PlaceHolder in UISearchBar? (iOS 13)
在寻找更新的 (iOS 13) 答案后,我没有找到任何解决这个简单问题的方法:
如何更改 UISearchBar
中占位符的 textColor
?
我的应用无法处理 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
方法:
if #available(iOS 13.0, *) {
searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString(string: "My PlaceHolder", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white.withAlphaComponent(0.80)])
}
问题是上下滚动时颜色会发生变化。
您可以使用 UITextField
appearance
属性 进行设置。检查这行代码
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
我想它不起作用的原因可能是你得到的searchController.searchBar.searchTextField = nil
。
searchTextField
是iOS 13
的新属性,如果只支持>= iOS 13
也可以做到。如果想适配之前版本的iOS 13
,可以遍历UISearchBar
找到UISearchBarTextField
,直接设置找到的UISearchBarTextField
.
我查的代码大概是这样的,我放在了UIView
的Category
.
- (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
来保存找到的值
_searchTextField = (UITextField *)[searchBar findChildViewClass:NSClassFromString(@"UISearchBarTextField") fromView: searchBar];
这是我现在用的,可以用了,希望对你有用
正如您已经提到的,您的代码仅适用于 viewDidAppear
,这使得占位符从默认灰色闪烁到首选颜色。
但是,在 viewDidAppear
之前似乎有一段时间(我无法确定确切时间),以便在视图实际出现之前更改占位符。
我想,这可能与 iOS 如何处理 light/dark 模式 and/or 和 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
}
}
}
}
此方法似乎没有性能 and/or 其他缺点。
如果其他人有更好的方法,请随时合作。
在寻找更新的 (iOS 13) 答案后,我没有找到任何解决这个简单问题的方法:
如何更改 UISearchBar
中占位符的 textColor
?
我的应用无法处理 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
方法:
if #available(iOS 13.0, *) {
searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString(string: "My PlaceHolder", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white.withAlphaComponent(0.80)])
}
问题是上下滚动时颜色会发生变化。
您可以使用 UITextField
appearance
属性 进行设置。检查这行代码
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
我想它不起作用的原因可能是你得到的searchController.searchBar.searchTextField = nil
。
searchTextField
是iOS 13
的新属性,如果只支持>= iOS 13
也可以做到。如果想适配之前版本的iOS 13
,可以遍历UISearchBar
找到UISearchBarTextField
,直接设置找到的UISearchBarTextField
.
我查的代码大概是这样的,我放在了UIView
的Category
.
- (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
来保存找到的值
_searchTextField = (UITextField *)[searchBar findChildViewClass:NSClassFromString(@"UISearchBarTextField") fromView: searchBar];
这是我现在用的,可以用了,希望对你有用
正如您已经提到的,您的代码仅适用于 viewDidAppear
,这使得占位符从默认灰色闪烁到首选颜色。
但是,在 viewDidAppear
之前似乎有一段时间(我无法确定确切时间),以便在视图实际出现之前更改占位符。
我想,这可能与 iOS 如何处理 light/dark 模式 and/or 和 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
}
}
}
}
此方法似乎没有性能 and/or 其他缺点。
如果其他人有更好的方法,请随时合作。