Как я могу изменить цвет текста UISearchBar
?
ios
swift
uisearchbar
MrTourkos
источник
источник
searchField
через KVC.Если вы хотите установить цвет текста для UISearchBar в раскадровке (без кода), это тоже легко сделать (в инспекторе идентичности). Вот красный текст для панели поиска.
источник
Работаю в 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]
источник
Если вам нужно только сделать его читабельным на темном фоне, вы можете изменить barStyle. Следующее делает текст и кнопки на панели поиска белыми:
источник
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
.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
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 появилась возможность напрямую обращаться к текстовому полю:
Вы можете написать код, чтобы он всегда был таким доступным.
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") } }
источник
Попробуй это,
Я использую это с приложением, ориентированным на 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
ThisSearchBar
будет иметь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; } } }
источник
В моей ситуации решение
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]]; [appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
источник
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
источник
Swift 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
источник
В Swift 5 вы можете сделать что-то вроде следующего:
источник
Это сработало для меня.
if #available(iOS 13.0, *) { searchBar.searchTextField.textColor = .white }
источник
Swift 5 Xcode 11.4 iOS 13.4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
источник