Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change the style of the UISearchController views?

Tags:

swift

swift3

tvos

Question:

How do I change the color/theme/style of the UISearchController in tvOS?

( Would appear I need to set UIStatusBarStyle some way, since the preferredStatusBarStyle override does not exist in tvOS for UISearchController)

Description:

Method called in my AppDelegate to programmatically create a searchNavigationController with on top a UISearchController and on bottom my custom UITableViewController called "searchResultsController" (SearchViewController)

func configueSearchController() -> UIViewController {

    let storyboard = UIStoryboard(name: "Search", bundle: nil)
    guard let searchResultsController = storyboard.instantiateViewController(withIdentifier: SearchViewController.storyboardIdentifier) as? SearchViewController else {
        fatalError("Unable to instatiate a SearchResultViewController from the storyboard.")
    }

    /*
     Create a UISearchController, passing the `searchResultsController` to
     use to display search results.
     */

    let searchController = UISearchController(searchResultsController: searchResultsController)
    searchController.searchResultsUpdater = searchResultsController
    searchController.searchBar.placeholder = NSLocalizedString("Enter keyword (e.g. Gastric Bypass)", comment: "")

    // Contain the `UISearchController` in a `UISearchContainerViewController`.
    let searchContainer = UISearchContainerViewController(searchController: searchController)
    searchContainer.title = NSLocalizedString("Search", comment: "")

    // Finally contain the `UISearchContainerViewController` in a `UINavigationController`.
    let searchNavigationController = UINavigationController(rootViewController: searchContainer)
    return searchNavigationController

}

Image of the visual representation of the above method:

UISearchViewController

What I've tried:

I've attempted to change the style via different approaches and none of them gave the desired outcome.

This has no effect on the searchBar:

searchController.searchBar.searchBarStyle = .minimal //or .prominent or .default

This only makes the searchBar (actual input area black.. with black text..):

searchController.searchBar.backgroundColor = .black

This only makes the whole background view of the UISearchController black. Everything is black and thus the keyboard can not be seen.

searchController.view.backgroundColor = .black

The ideal solution would be a theme change from the standard .default to something .dark. Because not only does the background color have to change but the borders and text colors must too.

Attempted to implement this solution:

//UISearchController
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

However, this override does not seem to exist for tvOS. Any reason why?

like image 847
kemicofa ghost Avatar asked Dec 06 '16 09:12

kemicofa ghost


1 Answers

For all those wanting to achieve this on tvOS with a TabBarController and storyboard, what I did was add a container view to my view controller and added the tab bar controller as a child.

class SearchController: UIViewController  {

    @IBOutlet var containerView: UIView!


    override func viewDidLoad() {
        super.viewDidLoad()

        let searchController = UISearchController.init(searchResultsController: nil)
        searchController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        searchController.view.frame = containerView.bounds        

        let searchContainer: UISearchContainerViewController = UISearchContainerViewController(searchController: searchController)

        // Finally contain the `UISearchContainerViewController` in a `UINavigationController`.
        let searchNavigationController = UINavigationController(rootViewController: searchContainer)
        searchNavigationController.navigationBar.isTranslucent = true
        searchNavigationController.navigationBar.tintColor = .black
        searchNavigationController.tabBarItem.title = "Search"

        containerView.addSubview(searchNavigationController.view)
        searchNavigationController.didMove(toParent: self)
    }
}
like image 151
tomo89aus Avatar answered Sep 30 '22 06:09

tomo89aus