Bagaimana cara mengubah warna teks a UISearchBar
?
ios
swift
uisearchbar
MrTourkos
sumber
sumber
searchField
melalui KVC.Jika Anda ingin mengatur warna teks untuk UISearchBar di storyboard (tanpa kode), itu juga mudah dilakukan (di inspektur identitas). Ini adalah teks merah untuk bilah pencarian.
sumber
Bekerja di Swift 4 untuk saya:
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]
sumber
Jika Anda hanya perlu membuatnya dapat dibaca di latar belakang yang gelap, Anda dapat mengubah barStyle. Hal berikut membuat teks dan tombol di bilah pencarian menjadi putih:
sumber
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 } }
sumber
Ini berfungsi untuk saya di iOS 11, Xcode 9:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
Saya menulisnya di
AppDelegate
tetapi saya rasa itu berhasil jika Anda meletakkannya di tempat lain juga.sumber
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
Ini tentu saja Objective-C, dengan terjemahan yang jelas ke Swift menggunakanappearance(whenContainedInInstancesOf:)
Sejak Xcode 11 dan iOS 13 menjadi mungkin untuk mengakses bidang teks secara langsung:
Anda dapat menulis beberapa kode agar selalu dapat diakses seperti ini.
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 } }
Anda juga bisa membuatnya tidak opsional dengan kesalahan fatal, kode ini diuji sejak iOS 7 hingga iOS 13GM. Tetapi saya hanya akan menggunakan versi opsional.
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") } }
sumber
Cara paling nyaman yang menurut saya adalah mengatur
textColor
propertiUISearchBar
.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 } } } }
Pemakaian
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 } } } }
Anda akan menggunakannya sebagai:
searchBar.textColor = UIColor.blueColor() // Your color
sumber
Coba ini,
Saya menggunakan ini dengan aplikasi yang menargetkan iOS 11 dan seterusnya.
[Pembaruan] Saya mengamati, aplikasi mogok pada versi yang lebih lama (<iOS 13), Tetapi kompiler tidak pernah mengeluh tentang pemeriksaan versi, seseorang tolong jelaskan mengapa ini terjadi.
sumber
Anda dapat melakukan ini dengan mengakses UITextField di dalam searchBar, lalu Anda dapat mengubah warna latar belakang, warna teks, dan semua properti UITextField lainnya.
tambahkan ekstensi berikut untuk mengakses 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 } }
sumber
Saya mencoba beberapa solusi yang ditulis di atas tetapi tidak berhasil (lagi, saya kira).
Jika Anda hanya ingin menangani iOS 13:
mySearchBar.searchTextField.textColor = .red
Tetapi jika Anda ingin menangani iOS yang lebih lama juga, Inilah cara yang saya lakukan:
Buat
UISearchBar
kelas khusus , yang disebutSearchBar : UISearchBar, UISearchBarDelegate
IniSearchBar
akan memilikiUISearchBarDelegate
metode yang ingin saya tangani dandelegate
kumpulannya.Dan saya menambahkan ke kelas:
var textField: UITextField? { if #available(iOS 13.0, *) { return self.searchTextField } return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField }
Penjelasan singkat:
Dengan iOS13 sekarang, Anda dapat mengakses
UITextField
thanks toUISearchBar.searchTextField
, yang merupakan tipeUISearchTextField
, yang diwarisi dariUITextField
.Karena saya tahu hierarki saya, saya tahu saya
textField
tidak akannill
menggunakan versi yang lebih lama jadi dalam kedua kasus, saya mendapatkan bidang teks yang dapat saya sesuaikan dengan mudah, mengerjakan setiap versi, dari 9 hingga 13 hari ini.Berikut adalah kode lengkap yang diperlukan untuk membuatnya berfungsi:
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 } } }
Anda juga dapat mengatur beberapa penyesuaian
SearchBar
dengan menambahkan ini di:let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self]) searchBar.backgroundImage = UIImage() searchBar.isTranslucent = false searchBar.returnKeyType = .search
Kemudian Anda mengaturnya ke XIB / Storyboard dan Anda menanganinya seperti jika itu sederhana
UISearchBar
(jika Anda tidak melupakan delegasi!).sumber
(Solusi ini hanya diuji untuk Xcode 10 & iOS 12.) Tambahkan ekstensi untuk mengakses bidang teks bilah pencarian:
extension UISearchBar { var textField: UITextField? { return subviews.first?.subviews.compactMap { $0 as? UITextField }.first } }
Kemudian gunakan properti itu untuk mengatur warna teks dari bidang teks di bilah pencarian Anda:
let searchBar = UISearchBar() searchBar.textField?.textColor = UIColor.white // or whichever color you want
// EDIT
Kode di atas tidak berfungsi untuk iOS 13. Cara yang lebih baik untuk menangani ini adalah dengan menggunakan:
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 } } }
sumber
// Coba orang ini
sumber
Swift 5.2 & iOS 13.3.1: -
Ini bekerja dengan baik.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
sumber
Berikut ini adalah versi Xamarin.iOS C # dari pendekatan "temukan UITextField". Ini tidak akan macet jika UITextField menghilang dalam hierarki tampilan iOS mendatang.
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; } } }
sumber
Dalam solusi situasi saya adalah
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]]; [appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
sumber
Obj-C
UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"]; textField.textColor = [UIColor redColor];
Cepat 4.x
let textField = yourSearchbar.value(forKey: "searchField") as? UITextField textField?.textColor = UIColor.red
sumber
Cepat 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
sumber
Di Swift 5 Anda dapat melakukan sesuatu seperti di bawah ini:
sumber
Ini berhasil untuk saya.
if #available(iOS 13.0, *) { searchBar.searchTextField.textColor = .white }
sumber
Swift 5 Xcode 11.4 iOS 13.4
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
sumber