iOS 11 UISearchBar in UINavigationBar

je veux placer une barre de recherche dans la nouvelle barre de navigation avec les nouveaux 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 obtenir est un fond bleu profond, mais je veux juste le changer en blanc.

enter image description here

le réglage de la couleur de fond résulte en ceci:

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

enter image description here

j'ai essayé aussi setScopeBarButtonBackgroundImage et setBackgroundImage sur la barre de recherche mais tout semble totalement bizarre.

aussi quand je déclenche la recherche en appuyant sur la barre de recherche, il passe à un mode avec le bouton Annuler sur le côté droit. ("Abbrechen "en allemand)

enter image description here

et la couleur du texte" Abbrechen " ne peut pas non plus être changée. (faut-il aussi blanc)

Toute aide est appréciée.

modifier: comme demandé, voici le code pour le style de 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 la barre de recherche arrière-plan, mais alors les coins arrondis sont perdus. Après avoir redessiné les coins arrondis, l'animation de la barre de recherche semble brisée.

enter image description here

donc toujours pas de solution satisfaisante. Il semble que la barre de recherche lorsqu'elle est intégrée dans la barre de navigation dans iOS 11 n'est pas possible de la personnaliser. Pendant ce temps, il serait suffisant pour moi de changer la couleur du texte placeholder, mais même cela ne semble pas être possible. (J'ai essayé plusieurs approches de StackOverflow - ne fonctionne pas)

17
demandé sur Darko 2017-09-01 13:14:13

6 réponses

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:

Animation avec coin arrondi fonctionne aussi très bien.

enter image description here

17
répondu Krunal 2017-09-16 07:02:42

j'ai changé le fond du champ de texte avec ce code à L'intérieur D'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
répondu Maruta 2017-10-08 11:57:17

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
répondu nkitku 2017-10-16 12:50:51

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
répondu Krunal 2017-09-01 10:50:43

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

1
répondu iOS_Mouse 2018-03-06 23:31:28

essayez ce code,

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.backgroundColor = [UIColor redColor];
0
répondu AshokPolu 2017-09-01 10:27:39