web-dev-qa-db-ja.com

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

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

65
MrTourkos

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

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

textFieldInsideSearchBar?.textColor = yourcolor

Swift 3 update

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

textFieldInsideSearchBar?.textColor = yourcolor
86
Christian Wörz

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

enter image description here

50
interrupt

Swift 4での作業:

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]
38
chronikum

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

searchController.searchBar.barStyle = .black
35
Bacon
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
    }
}
29
Adam Waite

最も便利な方法は、textColorUISearchBarプロパティを設定することです。

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

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

次のように使用します。

searchBar.textColor = UIColor.blueColor() // Your color
10
Tal Zion

これはiOS 11、Xcode 9で動作します:

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

AppDelegateに書き込みますが、他の場所に置いても機能すると思います。

9
juanjo

これを行うには、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
Omar Albeik

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

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

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

searchBar.searchTextField

常にこのようにアクセスできるようにするコードを書くことができます。

extension UISearchBar {
    public var textField: UITextField? {
        guard let firstSubview = subviews.first else {
            assertionFailure("Could not find text field")
            return nil
        }

        for view in firstSubview.subviews {
            if #available(iOS 13.0, *) {
                return searchTextField
            } else {
                if let textView = view as? UITextField {
                    return textView
                }
            }
        }

        assertionFailure("Could not find text field")

        return nil
    }
}

また、致命的なエラーでオプションではなくすることもできます。このコードは、iOS 7からiOS 13b6までテストされています。しかし、私はオプションのバージョンに行きます。

extension UISearchBar {
    public var textField: UITextField {
        guard let firstSubview = subviews.first else {
            fatalError("Could not find text field")
        }

        for view in firstSubview.subviews {
            if #available(iOS 13.0, *) {
                return searchTextField
            } else {
                if let textView = view as? UITextField {
                    return textView
                }
            }
        }

       fatalError("Could not find text field")
    }
}
0
Saren Inden

私の状況では、ソリューションは

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

「UITextFieldを見つける」アプローチのXamarin.iOS C#バージョンを以下に示します。将来のiOSビュー階層でUITextFieldが消えてもクラッシュしません。

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
t9mike