UISearchBar arama metni rengini nasıl değiştirebilirim?


Yanıtlar:


108

UITextFieldUISearchBar'ın içine erişmeniz gerekir . Bunu kullanarak yapabilirsinizvalueForKey("searchField")

var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

Swift 3 güncellemesi

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

1
Cevabımı düzenledim. Alana evaleforkey ("searchField") kullanarak erişebilirsiniz
Christian

7
Özel API değil, ancak çok kırılgan ve herhangi bir iOS güncellemesinde bozulabilir. Üretim kodunda buna benzer şeyleri asla kullanmamalısınız
Lope

2
@Christian - orijinal cevabın ne zaman gönderildiği önemli değil, yine de özel API'ye güveniyor. Halka açık olsaydı, searchFieldKVC üzerinden erişmeniz gerekmezdi .
Greg Brown

1
Olumsuz oy. Apple tarafından onaylanan ve bozulma olasılığı çok daha düşük olan çok daha sağlam bir yaklaşım için @ juanjo'nun cevabına ve yorumuma bakın.
RobP

1
Bu yanıtı kullanmayın, özel API'lere erişiyorsunuz ve uygulamanızın reddedilmesine neden olabilir.
aryaxt

64

Film şeridinde (kod olmadan) UISearchBar için metin rengi ayarlamak istiyorsanız, bunu yapmak da kolaydır (kimlik denetçisinde). İşte arama çubuğu için kırmızı bir metin.

görüntü açıklamasını buraya girin


2
Görünüm öğeleri için daha az koda sahip olmak daha iyidir. Teşekkürler.
NRR

Mükemmel çözüm!
Mona

50

Benim için Swift 4'te çalışmak:

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]

Benim için çalışıyor.
Surjeet Rajput

ve modüldeki her arama çubuğu için renk değiştiriyor mu?
Zaporozhchenko Oleksandr

48

Yalnızca koyu bir arka planda okunabilir hale getirmeniz gerekiyorsa, barStyle'ı değiştirebilirsiniz. Aşağıdakiler, arama çubuğundaki metin ve düğmeleri beyaz yapar:

searchController.searchBar.barStyle = .black

@Bacon, o da yardımcı oldu! Teşekkürler
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
    }
}

Sizin gibi çözüm. Teşekkürler.
Bagusflyer

Çubuk renk tonundan ayrı olarak metin alanının arka plan rengini kontrol etmek için "searchField.backgroundColor" da ekleyebilirsiniz.
Sherwin Zadeh

14

Bu benim için iOS 11, Xcode 9'da çalışıyor:

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

İçinde yazıyorum AppDelegateama başka bir yere de koyarsan işe yarıyor sanırım.


3
Bu, kabul edilen cevap ve diğer cevaplardaki anahtar-değer saçmalığından çok daha sağlam bir yaklaşımdır. Ancak Apple, burada kullandığınız API'yi kullanımdan [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];appearance(whenContainedInInstancesOf:)
kaldırmış

2
Gerçek bir cihazda Xcode 10, iOS 12'de benim için çalışmıyor gibi görünüyor.
Oded

11

Xcode 11 ve iOS 13'ten beri metin alanına doğrudan erişim mümkün hale geldi:

searchBar.searchTextField

Her zaman bu şekilde erişilebilir olmasını sağlamak için bir kod yazabilirsiniz.

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
    }
}

Ayrıca ölümcül hatalarla isteğe bağlı olmamasını da sağlayabilirsiniz, bu kod iOS 7'den iOS 13GM'ye kadar test edilmiştir. Ama sadece isteğe bağlı versiyona giderdim.

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")
    }
}

En sonunda! Metin alanına doğrudan erişebiliriz. Teşekkürler Saren.
Mark Moeykens

10

Bence en uygun yol bir textColormülk ayarlamaktır UISearchBar.

Swift 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
               }
           }
       }
   }

Kullanım

searchBar.textColor = UIColor.blue // Your color

Swift 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
         }
     }
 }
} 

Bunu şu şekilde kullanırsınız:

searchBar.textColor = UIColor.blueColor() // Your color

benim için çalışmıyor. textcolor özelliğini ne zaman ayarlarsınız?
Kingalione

1
@Kingalione bunu 'viewDidLoad ()' içinde ayarlayabilirsiniz
Tal Zion

Evet, placholder yazı rengini değiştirmek istedim. Şimdi çözümleri buldum. Yine de teşekkürler
Kingalione

4

Bunu dene,

searchBar.searchTextField.textColor = .white

Bunu iOS 11'i hedefleyen uygulama ile kullanıyorum.

[Güncelleme] Gözlemledim, uygulama eski sürümlerde (<iOS 13) çöküyor, ancak derleyici sürüm kontrolünden hiç şikayet etmedi, lütfen birisi bunun neden olduğunu açıklasın.


3

Bunu searchBar içindeki UITextField'e erişerek yapabilirsiniz, ardından arka plan rengini, metin rengini ve diğer tüm UITextField özelliklerini değiştirebilirsiniz.

textField'a erişmek için aşağıdaki uzantıyı ekleyin

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
    }
}

3

Yukarıda yazılı çözümlerden birkaçını denedim ama işe yaramadı (artık sanırım).

Yalnızca iOS 13'ü kullanmak istiyorsanız:

mySearchBar.searchTextField.textColor = .red

Ancak daha eski iOS'la da başa çıkmak istiyorsanız, işte yaptığım yol:

Bu , işlemek istediğim yöntemlere ve setine sahip olacak UISearchBaradlı özel bir sınıf oluşturun .SearchBar : UISearchBar, UISearchBarDelegateSearchBarUISearchBarDelegatedelegate

Ve sınıfa ekliyorum:

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }

Kısa açıklama:

Artık iOS13 ile , miras kalan türünden olan UITextFieldteşekkürler'e erişebilirsiniz .UISearchBar.searchTextFieldUISearchTextFieldUITextField

Hiyerarşimi bildiğim için, eski sürümlerimin eski sürümler için textFieldolmayacağını biliyorum, nillbu yüzden her iki durumda da, bugün 9'dan 13'e kadar her sürümde çalışarak kolayca özelleştirebileceğim bir metin alanı alıyorum.

İşte çalışması için gereken kodun tamamı:


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
        }
    }

}

Aşağıdakilere SearchBarekleyerek de bazı özelleştirmeleri ayarlayabilirsiniz :

        let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
        searchBar.backgroundImage = UIImage()
        searchBar.isTranslucent = false
        searchBar.returnKeyType = .search

Sonra onu XIB / Storyboard'a ayarlıyorsunuz ve basitmiş gibi hallediyorsunuz UISearchBar(delegeleri unutmadıysanız!).


2

(Bu çözüm yalnızca Xcode 10 ve iOS 12 için test edilmiştir.) Arama çubuğunun metin alanına erişmek için bir uzantı ekleyin:

extension UISearchBar {
    var textField: UITextField? {
        return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
    }
}

Ardından, arama çubuğunuzdaki metin alanının metin rengini ayarlamak için bu özelliği kullanın:

let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want

// DÜZENLE

Yukarıdaki kod iOS 13 için çalışmaz. Bunu halletmenin daha iyi bir yolu şunu kullanmaktır:

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 }
    }
}

iOS 13 için subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
Taras

2

// Bu adamı dene

yourSearchbar.searchTextField.textColor = .white

2

Swift 5.2 ve iOS 13.3.1: -

İyi çalışıyor.

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


1

Burada "UITextField bul" yaklaşımının Xamarin.iOS C # sürümü verilmiştir. UITextField, gelecekteki iOS görünüm hiyerarşisinde kaybolursa çökmez.

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;
        }
    }
}

0

Benim durumumda çözüm

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

0

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

0

Swift 5:

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


0

Swift 5'te aşağıdaki gibi bir şey yapabilirsiniz:

yourSearchBar.searchTextField.textColor = .yourColor

0

Bu benim için çalıştı.

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

-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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.