UISearchBar
のテキストの色を変更するにはどうすればよいですか?
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
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]
暗い背景でのみ読み取り可能にする必要がある場合は、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
}
}
最も便利な方法は、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
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
これはiOS 11、Xcode 9で動作します:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue
AppDelegate
に書き込みますが、他の場所に置いても機能すると思います。
これを行うには、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
}
}
(このソリューションは、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")
}
}
私の状況では、ソリューションは
id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];
「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;
}
}
}