Reputation: 3338
I'm struggling with this for a while now. Have searched everywhere but the solution provided only works with objective-c. Which consists in
UITextField *txt = [_searchBar valueForKey:@"_searchField"];
Although some might say that this is protected API and Apple might refuse an app with such code.
So, now I've tried so many ways to work this out and it's not working at all. My code is this:
searchBar = UISearchBar(frame: CGRectMake(0, 0, 320.0, 30.0))
searchBar.autoresizingMask = UIViewAutoresizing.FlexibleWidth
searchBar.searchBarStyle = UISearchBarStyle.Minimal
searchBar.layer.cornerRadius = 15
searchBar.delegate = self
searchBar.backgroundColor = UIColor.whiteColor()
if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1{
// Load resources for iOS 6.1 or earlier
searchBar.placeholder = "Search";
} else {
// The following "hack" (if we can call that) breaks the UI for different size devices.
// Load resources for iOS 7 or later
searchBar.placeholder = "Search ";
}
This gives me the bizarre result:
While what I want is just the textfield inside the UISearchBar to have a white background and the SearchBar itself have a cornerRadius of, say, 15.
How can I do this?
Thanks so much in advance
Upvotes: 21
Views: 17741
Reputation: 9141
When using iOS 13 or newer, the searchTextField
property can be directly accessed.
However, setting the backgroundColor
only works as expected when the borderStyle
is set to .none
. This results in a text field without rounded borders. To fix this, use this code:
searchController.searchBar.searchTextField.borderStyle = .none
searchController.searchBar.searchTextField.backgroundColor = .white // Or any other UIColor
searchController.searchBar.searchTextField.layer.cornerRadius = 8.0
Upvotes: 0
Reputation: 1805
Swift 5 and iOS 13
searchBar.searchTextField.backgroundColor = .white
You can direct change colour of textfield background.
Upvotes: 10
Reputation: 226
searchController.searchBar.searchTextField.backgroundColor = UIColor.white searchController.searchBar.searchTextField.textColor = UIColor.black
Upvotes: 1
Reputation: 18898
Add an extension to UISearchBar
to access its UITextField
:
import UIKit
extension UISearchBar {
var textField: UITextField? {
let subViews = subviews.flatMap { $0.subviews }
return (subViews.filter { $0 is UITextField }).first as? UITextField
}
}
Then you can set its properties as you'd expect:
searchController.searchBar.textField?.backgroundColor = .red
searchController.searchBar.textField?.tintColor = .yellow
Upvotes: 3
Reputation: 1200
In Swift 3:
if let txfSearchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
txfSearchField.borderStyle = .none
txfSearchField.backgroundColor = .lightGray
}
Upvotes: 18
Reputation: 615
Adding to the above answer. If you want to keep the search bar style UISearchBarStyleMinimal and change the background of UISearchBar's textField, set the textField's borderStyle to UITextBorderStyleNone
Objective C:
self.searchBar.searchBarStyle = UISearchBarStyleMinimal;
UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.borderStyle = UITextBorderStyleNone;
txfSearchField.backgroundColor = yourColor;
Upvotes: 10
Reputation: 1407
You have to access the UITextField inside the UISearchBar. You can do that by
using valueForKey("searchField")
var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField
textFieldInsideSearchBar?.textColor = yourcolor
textFieldInsideSearchBar?.backgroundColor = backgroundColor
...
there you can change any parameters like textColor or backgroundColor of the UITextField
Upvotes: 32