Patrick Bassut
Patrick Bassut

Reputation: 3338

Change the background of UISearchBar's textField

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: enter image description here

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

Answers (7)

Ely
Ely

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

vp2698
vp2698

Reputation: 1805

Swift 5 and iOS 13

searchBar.searchTextField.backgroundColor = .white

You can direct change colour of textfield background.

Upvotes: 10

prudhvireddy
prudhvireddy

Reputation: 226

searchController.searchBar.searchTextField.backgroundColor = UIColor.white searchController.searchBar.searchTextField.textColor = UIColor.black

Upvotes: 1

Daniel Storm
Daniel Storm

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

Tuslareb
Tuslareb

Reputation: 1200

In Swift 3:

if let txfSearchField = searchController.searchBar.value(forKey: "_searchField") as? UITextField {
        txfSearchField.borderStyle = .none
        txfSearchField.backgroundColor = .lightGray
    }

Upvotes: 18

dreamer.psp
dreamer.psp

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

helgetan
helgetan

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

Related Questions