Bagaimana cara mengubah warna teks pencarian UISearchBar?

88

Bagaimana cara mengubah warna teks a UISearchBar?

MrTourkos
sumber

Jawaban:

108

Anda harus mengakses bagian UITextFielddalam 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
Kristen
sumber
1
Saya telah mengedit jawaban saya. Anda dapat mengakses lapangan dengan menggunakan valueforkey ("searchField")
Christian
7
Ini bukan API pribadi tetapi sangat rapuh dan dapat rusak pada pembaruan iOS apa pun. Anda tidak boleh menggunakan hal-hal seperti ini dalam kode produksi
Lope
2
@Christian - tidak masalah kapan jawaban asli diposting, itu masih bergantung pada API pribadi. Jika itu publik, Anda tidak perlu mengakses searchFieldmelalui KVC.
Greg Brown
1
Suara negatif. Lihat jawaban @juanjo dan komentar saya untuk pendekatan yang jauh lebih kuat yang disetujui oleh Apple dan jauh lebih kecil kemungkinannya untuk rusak.
RobP
1
Jangan gunakan jawaban ini, Anda mengakses API pribadi dan aplikasi Anda bisa ditolak.
aryaxt
64

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.

masukkan deskripsi gambar di sini

mengganggu
sumber
2
Lebih baik memiliki lebih sedikit kode untuk elemen tampilan. Terima kasih.
NRR
Solusi yang tepat!
Mona
50

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]
chronikum.dll
sumber
Bekerja untuk saya.
Surjeet Rajput
dan itu berubah warna untuk setiap bilah pencarian di modul?
Zaporozhchenko Oleksandr
48

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
Daging babi asap
sumber
@Bacon, Itu membantu juga! Terima kasih
Goppinath
32
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
    }
}
Adam Waite
sumber
Seperti solusi Anda. Terima kasih.
Bagusflyer
Anda juga dapat menambahkan "searchField.backgroundColor" untuk mengontrol warna latar belakang bidang teks yang terpisah dari warna batang.
Sherwin Zadeh
14

Ini berfungsi untuk saya di iOS 11, Xcode 9:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

Saya menulisnya di AppDelegatetetapi saya rasa itu berhasil jika Anda meletakkannya di tempat lain juga.

juanjo
sumber
3
Ini adalah pendekatan yang jauh lebih kuat daripada nilai kunci yang tidak masuk akal dalam jawaban yang diterima dan jawaban lainnya. Namun, Apple dalam kebijaksanaan mereka telah menghentikan API yang Anda gunakan di sini dan menawarkan versi baru untuk iOS 9.0 dan yang lebih baru, seperti: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];Ini tentu saja Objective-C, dengan terjemahan yang jelas ke Swift menggunakanappearance(whenContainedInInstancesOf:)
RobP
2
Sepertinya tidak berfungsi untuk saya di Xcode 10, iOS 12, pada perangkat yang sebenarnya.
Oded
11

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")
    }
}
Saren Inden
sumber
Akhirnya! Kita dapat mengakses kolom teks secara langsung. Terima kasih, Saren.
Mark Moeykens
10

Cara paling nyaman yang menurut saya adalah mengatur textColorproperti 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
Tal Zion
sumber
tidak bekerja untuk saya. kapan Anda menyetel properti textcolor?
Kingalione
1
@Kingalione Anda dapat mengatur ini di 'viewidLoad ()'
Tal Zion
Ya, saya ingin mengubah warna teks placholder. Sekarang saya menemukan solusinya. Terima kasih
Kingalione
4

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.

infiniteLoop
sumber
3

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
    }
}
Omar Albeik
sumber
3

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 UISearchBarkelas khusus , yang disebut SearchBar : UISearchBar, UISearchBarDelegate Ini SearchBarakan memiliki UISearchBarDelegatemetode yang ingin saya tangani dan delegatekumpulannya.

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 UITextFieldthanks to UISearchBar.searchTextField, yang merupakan tipe UISearchTextField, yang diwarisi dariUITextField .

Karena saya tahu hierarki saya, saya tahu saya textFieldtidak akan nillmenggunakan 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 SearchBardengan 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!).

Bryan ORTIZ
sumber
2

(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 }
    }
}
David Steppenbeck
sumber
untuk iOS 13 kembalikan subviews.first? .subviews.last? .subviews.compactMap {$ 0 sebagai? UITextField}. Terakhir
Taras
2

// Coba orang ini

yourSearchbar.searchTextField.textColor = .white
Nrv
sumber
2

Swift 5.2 & iOS 13.3.1: -

Ini bekerja dengan baik.

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

Dinesh Kumar
sumber
1

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;
        }
    }
}
t9mike
sumber
0

Dalam solusi situasi saya adalah

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
poGUIst
sumber
0

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
Argus
sumber
0

Cepat 5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)

ramzesenok
sumber
0

Di Swift 5 Anda dapat melakukan sesuatu seperti di bawah ini:

yourSearchBar.searchTextField.textColor = .yourColor
johnDoe
sumber
0

Ini berhasil untuk saya.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }
Lovina Hajirawala
sumber
-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
blyscuit
sumber