UISearchBarの検索テキストの色を変更するにはどうすればよいですか?


回答:


108

UITextFieldUISearchBarの内部にアクセスする必要があります。あなたはを使用してそれを行うことができますvalueForKey("searchField")

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

textFieldInsideSearchBar?.textColor = yourcolor

Swift3アップデート

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

textFieldInsideSearchBar?.textColor = yourcolor

1
回答を編集しました。valueforkey( "searchField")を使用してフィールドにアクセスできます
クリスチャン

7
これはプライベートAPIではありませんが、非常に壊れやすく、iOSのアップデートで壊れることがあります。このようなものを本番コードで使用しないでください
Lope

2
@ Christian-元の回答がいつ投稿されたかは関係ありませんが、それでもプライベートAPIに依存しています。公開されている場合は、searchFieldKVC経由でアクセスする必要はありません。
グレッグブラウン

1
反対票を投じる。Appleによって承認された、はるかに堅牢で壊れにくいアプローチについては、@ juanjoの回答と私のコメントを参照してください。
RobP 2018年

1
この回答は使用しないでください。プライベートAPIにアクセスしているため、アプリが拒否される可能性があります。
aryaxt 2018

63

ストーリーボード(コードなし)でUISearchBarのテキストの色を設定する場合は、(IDインスペクターでも)簡単に設定できます。これが検索バーの赤いテキストです。

ここに画像の説明を入力してください


2
ビュー要素のコードは少なくすることをお勧めします。ありがとう。
NRR 2015

完璧な解決策!
モナ

49

私のためにSwift4で働いています:

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]

私のために働いています。
Surjeet Rajput 2018

モジュール内のすべての検索バーの色が変わりますか?
zaporozhchenkoOleksandr19年

48

暗い背景でのみ読み取り可能にする必要がある場合は、barStyleを変更できます。以下は、検索バーのテキストとボタンを白くします。

searchController.searchBar.barStyle = .black

@ベーコン、それも役に立ちました!ありがとう
Goppinath 2018年

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

あなたのような解決策。ありがとう。
Bagusflyer 2016年

「searchField.backgroundColor」を追加して、バーの色合いとは別にテキストフィールドの背景色を制御することもできます。
SherwinZadeh19年

13

これは、iOS 11、Xcode9で機能します。

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

私はそれを書いていAppDelegateますが、あなたがそれをどこかに置いてもうまくいくと思います。


3
これは、受け入れられた回答や他の回答のKey-Valueナンセンスよりもはるかに堅牢なアプローチです。ただし、Appleは、ここで使用するAPIを非推奨にし、iOS 9.0以降の新しいバージョンを提供しています。[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];これはもちろんObjective-Cであり、appearance(whenContainedInInstancesOf:)
RobP

2
実際のデバイスでは、Xcode 10、iOS12では機能しないようです。
2018年

10

私が思う最も便利な方法は、にtextColorプロパティを設定することです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
               }
           }
       }
   }

使用法

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

私のために働いていません。textcolorプロパティはいつ設定しますか?
Kingalione 2017年

1
@Kingalioneこれは「viewDidLoad()」で設定できます
Tal Zion

ええ、プラクホルダーのテキストの色を変更したかったのです。今、私は解決策を見つけました。とにかくありがとう
Kingalione 2017年

10

Xcode11およびiOS13以降、テキストフィールドに直接アクセスできるようになりました。

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

致命的なエラーでオプションではないようにすることもできます。このコードはiOS7からiOS13GMまでテストされています。しかし、私はオプションのバージョンを選ぶでしょう。

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

最後に!テキストフィールドに直接アクセスできます。ありがとう、サレン。
MarkMoeykens19年

4

これを試して、

searchBar.searchTextField.textColor = .white

iOS11以降を対象としたアプリでこれを使用しています。

[更新]古いバージョン(<iOS 13)でアプリがクラッシュすることを確認しましたが、コンパイラーがバージョンチェックについて文句を言うことはありませんでした。誰かがなぜこれが起こったのか説明してください。


3

これを行うには、searchBar内の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
    }
}

3

上記の解決策をいくつか試しましたが、うまくいきませんでした(もう、私は推測します)。

iOS 13のみを処理する場合:

mySearchBar.searchTextField.textColor = .red

しかし、古いiOSも処理したい場合は、次のようにします。

UISearchBarと呼ばれるカスタムクラスを作成します。SearchBar : UISearchBar, UISearchBarDelegate これ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.searchTextFieldUISearchTextFieldUITextField

私は自分の階層を知っているので、古いバージョンに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ます(デリゲートを忘れなかった場合)。


2

(このソリューションは、Xcode10およびiOS12でのみテストされています。)検索バーのテキストフィールドにアクセスするための拡張機能を追加します。

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

//編集

上記のコードはiOS13では機能しません。これを処理するためのより良い方法は次を使用することです。

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の場合、 subviews.first?.subviews.last?.subviews.compactMap {$ 0 as?.last UITextFieldの}
タラス

2

//この男を試してみてください

yourSearchbar.searchTextField.textColor = .white

1

これは、「UITextFieldを見つける」アプローチのXamarin.iOS C#バージョンです。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;
        }
    }
}

1

Swift5.2およびiOS13.3.1:-

それはうまくいきます。

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


0

私の状況では、解決策は

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では、次のようなことができます。

yourSearchBar.searchTextField.textColor = .yourColor

0

これは私のために働いた。

    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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.