この質問は、SOでmany回何度も尋ねられたことを理解しています。ただし、AppleはiOS 11のリリースで最も効果的です)、UISearchBar
に一見不要な変更を加えたようです。具体的には、ビュー階層。
さらに、検索バーの「テキストフィールド」は検索バーのサブビューでアクセスできなくなり、以前のソリューションのallが「アクセス」してテキストフィールドの背景色を変更する、またはその問題のテキストフィールドの任意のプロパティ。
FYI:特にテキストの背後の色について話している...検索バーのスタイルを最小限に指定しない限り、11の時点ではデフォルトで白になっています。
更新1:
この質問の投稿以来、私はまだこの問題に対する有効なまたは本当にany実際の解決策を見つけていません。私が来たように思われる最も近いのは、インスタンスプロパティの外観に深く飛び込むことです
[[UISearchBar class] appearanceWhenContainedInInstancesOfClasses:(nonnull NSArray<Class<UIAppearanceContainer>> *)]
UISearchBar
の。次のようなメソッドを介して、見つかったUITextField
で遊んでみます。
if ([view isKindOfClass:[UITextField class]]) {
return (UITextField*)view;
}
UITextField *searchTextField;
for (UIView *subview in view.subviews) {
searchTextField = [self searchViewForTextFieldBg:subview];
if (searchTextField) {
break;
}
}
return searchTextField;
new背景ビューの描画を開始して、ビューの後ろに配置できます。しかし、これ以上追求するのが面倒なので、元の背景を正確に模倣するために正しいフレーム/境界でビューを描画するという問題がありました。
うまくいけば、誰かがこの問題の実際の解決策を見つけることができます。ナイスミスアップル...
これを探しているのではないでしょうか?しかし、私はそれをSwift :(
@IBOutlet weak var sbSearchBar: UISearchBar!
if let textfield = sbSearchBar.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
textfield.backgroundColor = UIColor.yellow
}
これが結果です:
このコードは、テキストフィールドの背景色を変更します。
Swift 4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//background color of text field
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan
}
これが結果です
_let searchBar = UISearchBar(frame: CGRect())
let searchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
let searchBarBackground: UIView? = searchBar.value(forKey: "background") as? UIView
// searchBarBackground?.removeFromSuperview()
if searchField != nil {
var frame = searchField?.frame
frame?.size.height = 30
searchField?.frame = frame!
searchField?.backgroundColor = .yellow
}
searchBar.barTintColor = .red
searchBar.delegate = self
searchBar.backgroundColor = .green
_
上記のコードでUISearchBarの背景色を設定すると、色付きのサブビューが次の画像のように表示されます(リンクをクリックすると表示されます)。 
backgroundColor
(UISearchBarサブビューのスーパービュー)緑のビューのクラス名がISearchBar in Object inspectorであることがわかります。
したがって、_searchBar.backgroundColor = .green
_を使用する場合は、SuperviewのbackgroundColorを緑に設定します。したがって、UISearchBarインスタンスプロパティbackgroundColor
は、スーパービューの背景色を設定します。
barTintColor
for UISearchBarBackground赤いビューのクラス名はISearchBarBackground in Object inspectorであることがわかります。
ただし、ビューにアクセスする直接的な方法はありません。[〜#〜] kvc [〜#〜]searchBar.value(forKey: "background") as? UIView
を使用して取得できますsearchBarBackground 。
_searchBar.barTintColor = .red
_を使用する場合、UISearchBarBackgroundのビューのbackgroundColorを赤に設定します。 ティントバーレイヤーの2つの黒い境界線を削除するには、スーパービューから背景を削除する必要があります。
searchField?.backgroundColor
_ for UITextFieldオブジェクトインスペクターで、黄色のビューのクラス名が_ UISearchBarSearchFieldBackgroundView(UISearchBarTextFieldのサブビュー)であることがわかります。
searchFieldに直接アクセスする方法はありません。searchBarBackgroundと同じです。 [〜#〜] kvc [〜#〜]searchField: UITextField? = searchBar.value(forKey: "searchField") as? UITextField
を使用して、searchFieldを取得することもできます。
_searchField?.backgroundColor = .yellow
_を使用する場合、UITextFieldのbackgroundColorを黄色に設定します。したがって、テキストフィールドの背景色を設定する場合は、最初に[〜#〜] kvc [〜#〜]を使用してsearchFieldにアクセスする必要があります
スウィフト4-5
searchController.searchBar.barTintColor = .white