web-dev-qa-db-fra.com

Afficher la barre de recherche dans la barre de navigation et le grand titre également sans défilement sur iOS 13

J'attache un UISearchController au navigationItem.searchController sur iOS 13. Cela fonctionne bien: je peux utiliser la belle barre de recherche de style iOS 13.

Cependant, j'aimerais voir les grands titres et la barre de recherche par défaut.

J'ai défini navigationItem.hidesSearchBarWhenScrolling = false Parce que je veux voir la recherche de manière permanente sur mon écran, mais la barre de recherche remplace les grands titres par défaut.

Est-ce que quelqu'un sait comment c'est possible?

Vérifiez ceci

navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false

C'est comme ça que ça a l'air This is how it looks actually

C'est ainsi que j'ai besoin d'implémenter (le titre grand titre et la barre de recherche visible) This is how I need to implement(large title and search bar both visible)

10
Bonnke

Pour moi, cela a fonctionné après avoir ajouté les lignes suivantes dans la méthode ViewDidLoad ():

searchController.hidesNavigationBarDuringPresentation = true navigationController?.navigationBar.prefersLargeTitles = true navigationController!.navigationBar.sizeToFit()

3
rohit

D'accord, j'ai essayé de réaliser la même chose toute la journée pour que mon application soit aussi bien et que je l'ai enfin fait.

Je voulais ajouter une barre de recherche dans une entreprise UitailViewController et je l'ai fait de cette façon.

    let searchController: UISearchController = {

    let searchController = UISearchController(searchResultsController: nil)

    searchController.searchBar.placeholder = "New Search"
    searchController.searchBar.searchBarStyle = .minimal
    searchController.dimsBackgroundDuringPresentation = false
    searchController.definesPresentationContext = true

   return searchController
}()

Vous créez d'abord une nouvelle UisearchController à l'aide d'une fermeture, de cette façon, vous êtes capable de l'utiliser dans le monde entier dans votre code et de le personnaliser plus facilement à l'avenir.

Ensuite, dans la vue ViewDidLoad, vous définissez le searchSontroller.searchResultsUpdater = self et le navigationItem.searchController = searchController.

Pour moi, cela fonctionne parfaitement après beaucoup d'essais et d'erreurs depuis que je fais tout tout par programme.

1
Defkalion1

Essayez ceci, fonctionnant bien de mon côté

    private var search = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()
        search.searchBar.delegate = self
        search.searchBar.sizeToFit()
        search.obscuresBackgroundDuringPresentation = false
        search.hidesNavigationBarDuringPresentation = true
        self.definesPresentationContext = true
        search.searchBar.placeholder = "Search here"
        self.navigationItem.searchController = search
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationItem.hidesSearchBarWhenScrolling = false
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationItem.hidesSearchBarWhenScrolling = true
    }

Pour une grande barre de navigation, utilisez cette

Pour la prise en charge complète de la barre de navigation de l'application, veuillez ajouter cette extension à l'intérieur de votre code.

import UIKit
extension UIViewController {


    open func showNavigationBar(_ large: Bool,
                                _ animated: Bool,
                                titleColor: UIColor,
                                barTintColor: UIColor,
                                fontSize: CGFloat) {

        navigationController?.navigationBar.barTintColor = barTintColor
        navigationController?.navigationBar.backgroundColor = barTintColor
        navigationController?.navigationBar.isTranslucent = true
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
        if large {
            self.navigationController?.navigationBar.prefersLargeTitles = true
            if #available(iOS 13.0, *) {
                let appearance = UINavigationBarAppearance()
                appearance.backgroundColor = barTintColor
                appearance.titleTextAttributes = [.foregroundColor: titleColor]
                appearance.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                       NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]

                navigationController?.navigationBar.standardAppearance = appearance
                navigationController?.navigationBar.compactAppearance = appearance
                navigationController?.navigationBar.scrollEdgeAppearance = appearance
            } else {
                self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                                                     NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: fontSize)!]
            }
        } else {
            self.navigationController?.navigationBar.prefersLargeTitles = false
            self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor,
                                                                            NSAttributedString.Key.font: UIFont(resource: R.font.robotoMedium, size: 20.0)!]
        }
    }
}

Puis appelez cette méthode simplement

self.showNavigationBar(true, true, titleColor: UIColor.blue, barTintColor: UIColor.red, fontSize: 32.0)

Si alors ne fonctionne pas non plus, utilisez ceci

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        search.searchBar.becomeFirstResponder()
    }

Une solution de plus est que l'ajout d'un uIView avec une hauteur 0 en storyboard et une touche de sécurité avec une zone de sécurité et un bas avec UiscrollView/Uicollectionview/utableview ou quelque chose d'autre vue défilable et supprimez la contrainte directe entre TOPSAREAEA et ScrollableView Haut. Je sais que ce n'est peut-être pas une solution mais j'ai fait dans un storyboard.

0
Kiran Sarvaiya