Як я можу змінити колір тексту a UISearchBar
?
Як я можу змінити колір тексту a 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]
Свіфт 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
.
Свіфт 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
Свіфт 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 всередині панелі пошуку, потім ви можете змінити його колір тла, колір тексту та всі інші властивості UITextField
додайте наступне розширення для доступу до textField
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 }
}
}
Ось версія 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.2 та iOS 13.3.1: -
Це чудово працює.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Свіфт 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)