のテキストの色を変更するにはどうすればよいUISearchBar
ですか?
回答:
UITextField
UISearchBarの内部にアクセスする必要があります。あなたはを使用してそれを行うことができますvalueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
Swift3アップデート
let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
searchField
KVC経由でアクセスする必要はありません。
私のために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]
暗い背景でのみ読み取り可能にする必要がある場合は、barStyleを変更できます。以下は、検索バーのテキストとボタンを白くします。
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
}
}
これは、iOS 11、Xcode9で機能します。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
私はそれを書いていAppDelegate
ますが、あなたがそれをどこかに置いてもうまくいくと思います。
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];
これはもちろんObjective-Cであり、appearance(whenContainedInInstancesOf:)
私が思う最も便利な方法は、に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
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")
}
}
これを行うには、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
}
}
上記の解決策をいくつか試しましたが、うまくいきませんでした(もう、私は推測します)。
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.searchTextField
UISearchTextField
UITextField
私は自分の階層を知っているので、古いバージョンに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
ます(デリゲートを忘れなかった場合)。
(このソリューションは、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 }
}
}
これは、「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;
}
}
}
Swift5.2およびiOS13.3.1:-
それはうまくいきます。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]