Bagaimana cara mengubah warna teks a UISearchBar
?
Jawaban:
Anda harus mengakses bagian UITextField
dalam UISearchBar. Anda dapat melakukannya dengan menggunakanvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Pembaruan Swift 3
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
melalui KVC.
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]
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:
searchController.searchBar.barStyle = .black
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
}
}
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.
[[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:
searchBar.searchTextField
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")
}
}
Cara paling nyaman yang menurut saya adalah mengatur textColor
properti UISearchBar
.
Swift 3.0.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
}
}
}
}
Pemakaian
searchBar.textColor = UIColor.blue // Your color
Swift 2.3.0
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
Coba ini,
searchBar.searchTextField.textColor = .white
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.
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
}
}
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 disebut SearchBar : UISearchBar, UISearchBarDelegate
Ini SearchBar
akan memiliki UISearchBarDelegate
metode yang ingin saya tangani dan delegate
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 to UISearchBar.searchTextField
, yang merupakan tipe UISearchTextField
, yang diwarisi dariUITextField
.
Karena saya tahu hierarki saya, saya tahu saya textField
tidak akan nill
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!).
(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 }
}
}
Swift 5.2 & iOS 13.3.1: -
Ini bekerja dengan baik.
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
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;
}
}
}
Cepat 5:
searchBar[keyPath: \.searchTextField].textColor = UIColor(...)
Ini berhasil untuk saya.
if #available(iOS 13.0, *) {
searchBar.searchTextField.textColor = .white
}