Как я могу изменить цвет текста UISearchBar
?
Ответы:
Вы должны получить доступ к UITextField
внутренней части UISearchBar. Вы можете сделать это, используя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
searchField
через KVC.
Работаю в 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]
public extension UISearchBar {
public func setTextColor(color: UIColor) {
let svs = subviews.flatMap { $0.subviews }
guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
tf.textColor = color
}
}
Это работает для меня на iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Я пишу это в, AppDelegate
но, думаю, он работает, если вы положите его в другое место.
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Это, конечно, Objective-C с очевидным переводом на Swift с использованиемappearance(whenContainedInInstancesOf:)
Я считаю, что самый удобный способ - установить textColor
свойство UISearchBar
.
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
Начиная с 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")
}
}
Попробуй это,
searchBar.searchTextField.textColor = .white
Я использую это с приложением, ориентированным на iOS 11 и новее.
[Обновление] Я заметил, что приложение вылетает в старых версиях (<iOS 13), но компилятор никогда не жаловался на проверку версии, кто-нибудь, пожалуйста, объясните, почему это произошло.
Вы можете сделать это, обратившись к UITextField внутри searchBar, затем вы можете изменить его цвет фона, цвет текста и все другие свойства UITextField.
добавьте следующее расширение для доступа к текстовому полю
extension UISearchBar {
/// Return text field inside a search bar
var textField: UITextField? {
let subViews = subviews.flatMap { $0.subviews }
guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
}
return textField
}
}
Я попробовал несколько решений, написанных выше, но они не работали (полагаю, больше).
Если вы хотите работать только с iOS 13:
mySearchBar.searchTextField.textColor = .red
Но если вы хотите работать и со старой iOS, вот как я поступил:
Создайте собственный UISearchBar
класс с именем SearchBar : UISearchBar, UISearchBarDelegate
This SearchBar
будет иметь UISearchBarDelegate
методы, которые я хочу обработать, и их delegate
набор.
И добавляю в класс:
var textField: UITextField? {
if #available(iOS 13.0, *) {
return self.searchTextField
}
return subviews.first?.subviews.first(where: { $0 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: { $0 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
(если вы не забыли делегатов!).
(Это решение протестировано только для Xcode 10 и iOS 12.) Добавьте расширение для доступа к текстовому полю панели поиска:
extension UISearchBar {
var textField: UITextField? {
return subviews.first?.subviews.compactMap { $0 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 { $0.recursiveSubviews }
}
func subviews<T: UIView>(ofType: T.Type) -> [T] {
return self.recursiveSubviews.compactMap { $0 as? T }
}
}
Swift 5.2 и iOS 13.3.1: -
Работает нормально.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Вот версия Xamarin.iOS C # подхода «найти 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;
}
}
}
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)