web-dev-qa-db-fra.com

iOS 11 UISearchBar dans UINavigationBar

Je souhaite placer une barre de recherche dans la nouvelle barre de navigation avec les nouveaux titres iOS 11 grands titres. Cependant, la couleur de la barre de recherche est automatiquement appliquée par iOS et je ne peux pas la changer. 

if #available(iOS 11.0, *) {
    let sc = UISearchController(searchResultsController: nil)
    navigationItem.searchController = sc
    navigationItem.hidesSearchBarWhenScrolling = false
}

La barre de recherche est sur un fond bleu foncé, mais je veux juste le changer en blanc. 

 enter image description here

La définition de la couleur d'arrière-plan entraîne les éléments suivants:

navigationItem.searchController?.searchBar.backgroundColor = UIColor.white

 enter image description here

J'ai aussi essayé setScopeBarButtonBackgroundImage et setBackgroundImage dans la barre de recherche, mais tout semble totalement bizarre.

De plus, lorsque je lance la recherche en appuyant sur dans la barre de recherche, il passe en mode avec le bouton d'annulation situé à droite. ("Abbrechen" en allemand)

 enter image description here

Et la couleur du texte "Abbrechen" ne peut pas non plus être modifiée. (besoin aussi blanc)

Toute aide est appréciée.

Edit: comme demandé, voici le code pour le style de la barre de navigation:

self.navigationBar.tintColor = UIColor.myWhite
self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarTitle()]
self.navigationBar.barTintColor = UIColor.myTint

if #available(iOS 11.0, *) {
    self.navigationBar.prefersLargeTitles = true
    self.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.myWhite, NSAttributedStringKey.font: UIFont.myNavigationBarLargeTitle()]
}

Résultat actuel: J'ai utilisé l’idée de Krunals pour définir la couleur de l’arrière-plan de la barre de recherche, mais les coins arrondis sont perdus. Après avoir redéfini les angles arrondis, l’animation de la barre de recherche semble interrompue.

 enter image description here

Donc toujours pas de solution satisfaisante. Il semble que la barre de recherche, lorsqu'elle est intégrée à la barre de navigation dans iOS 11, ne puisse pas être personnalisée. En attendant, il me suffirait de changer la couleur du texte fictif, mais même cela ne semble pas possible. (J'ai essayé plusieurs approches de StackOverflow - cela ne fonctionne pas)

17
Darko

Maintenant c'est ce que tu veux ...

if #available(iOS 11.0, *) {
            let sc = UISearchController(searchResultsController: nil)
            sc.delegate = self
            let scb = sc.searchBar
            scb.tintColor = UIColor.white
            scb.barTintColor = UIColor.white


            if let textfield = scb.value(forKey: "searchField") as? UITextField {
                textfield.textColor = UIColor.blue
                if let backgroundview = textfield.subviews.first {

                    // Background color
                    backgroundview.backgroundColor = UIColor.white

                    // Rounded corner
                    backgroundview.layer.cornerRadius = 10;
                    backgroundview.clipsToBounds = true;

                }
            }

            if let navigationbar = self.navigationController?.navigationBar {
                navigationbar.barTintColor = UIColor.blue
            }
            navigationItem.searchController = sc
            navigationItem.hidesSearchBarWhenScrolling = false

}

Résultat:

 enter image description here

 enter image description here


Avec coin arrondi:
L'animation avec coins arrondis fonctionne également très bien.

 enter image description here

18
Krunal

Objectif c

if (@available(iOS 11.0, *)) {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.navigationItem.searchController=self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling=NO;
    self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;
    self.searchController.searchBar.showsBookmarkButton = NO;
    self.searchController.searchBar.placeholder = @"Search";
    self.searchController.searchBar.tintColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    self.searchController.searchBar.barTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    UITextField *txfSearchField = [self.searchController.searchBar valueForKey:@"_searchField"];
    txfSearchField.tintColor=[UIColor colorWithRed:21/255.0 green:157/255.0 blue:130/255.0 alpha:1];
    txfSearchField.textColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:1];
    txfSearchField.backgroundColor=[UIColor whiteColor];
    UIView *backgroundview= [[txfSearchField subviews]firstObject ];
    backgroundview.backgroundColor=[UIColor whiteColor];
    // Rounded corner
    backgroundview.layer.cornerRadius = 8;
    backgroundview.clipsToBounds = true;
}
2
nkitku

J'ai changé le fond du champ de texte avec ce code dans AppDelegate. 

Swift 4 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        //background color of text field
         UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).backgroundColor = .cyan

        }

C'est le résultat

 example used to change the background to cyan color

2
Maruta

C'est le code que j'ai utilisé pour rendre la barre de recherche blanche:

if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {
                backgroundview.backgroundColor = UIColor.init(white: 1, alpha: 1)
                backgroundview.layer.cornerRadius = 10
                backgroundview.clipsToBounds = true
            }
        }

 enter image description here

2
iOS_Mouse

Cela devrait fonctionner pour vous

func addSearchbar(){
        if #available(iOS 11.0, *) {
            let sc = UISearchController(searchResultsController: nil)
            let scb = sc.searchBar
            scb.tintColor = UIColor.white

            if let navigationbar = self.navigationController?.navigationBar {
                //navigationbar.tintColor = UIColor.green
                //navigationbar.backgroundColor = UIColor.yellow
                navigationbar.barTintColor = UIColor.blue
            }

            navigationController?.navigationBar.tintColor = UIColor.green
            navigationItem.searchController = sc
            navigationItem.hidesSearchBarWhenScrolling = false
        }
}


Résultat:

 enter image description here

 enter image description here

1
Krunal

Essayez ce code,

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.backgroundColor = [UIColor redColor];
0
AshokPolu