web-dev-qa-db-fra.com

iOS 9 searchBar disparaît de la vue en-tête de table lorsque UISearchController est actif

La structure:

View1 (cliquez sur un bouton) -> présent modalement (MyModalView: UITableViewController)

MyModalView a UISearchController intégré. La barre de recherche de UISearchController est placée dans MyModalView.tableView.tableHeaderView.

Cela fonctionne bien depuis iOS 8.0. Toutefois, sur iOS 9, la barre de recherche disparaît lorsque UISearchController est actif. S'il vous plaît jeter un oeil à ces images ci-dessous

La vue modale:  modal view

UISearchController actif sur iOS 8:  search bar in iOS 8

UISearchController actif sur iOS 9:  search bar in iOS 9

Le code très standard:

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}

Ce problème se produit également dans iOS 9.1 beta ... 

Toute idée/pointeur serait profondément apprécié

À votre santé.

53
David Trang

Il semble que nous ayons tous le même problème, mais ils ont été résolus de différentes manières. Cependant, aucune des réponses suggérées n'a fonctionné pour moi :(. Néanmoins, merci à tous pour votre temps. 

J'ai une solution qui a résolu mon problème. Définissez Extend Edges - Sous les barres opaques de my (MyModalView: UITableViewController) sur true dans le storyboard à l'aide d'Interface Builder. 

En résumé:

MyModalView: UITableViewController, dans Storyboard à l'aide d'Interface Builder a

Étendre les bords: - Sous les barres supérieures cochées - Sous les barres inférieures cochées - Sous les barres opaques cochées

 screenshot

64
David Trang

Je ne sais pas quel est exactement le problème, mais je l'ai 'résolu' par:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

Je suppose que UISearchController fait quelque chose de génial quand il essaie de se présenter comme une barre de navigation. Donc, c'est un hack, mais au moins cela ne bloque pas l'utilisateur. La barre de recherche ne fait pas l'animation cool et couvre la barre de navigation.

66
Shwethascar

J'ai trouvé que ce sont les mesures simulées (barre du haut) du storyboard qui sont à l'origine de ce problème . Dans mon cas, les lignes suivantes fonctionnent, mais je ne sais toujours pas pourquoi.

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}
36
wiles duan

J'ai dû 

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

J'ai trouvé une question similaire ici mais dans mon cas, ce n'était pas sur la méthode viewDidLoad. J'ai dû essayer différentes vues jusqu'à ce que cela fonctionne. Maintenant, je peux avoir à la fois une couleur de barre de navigation personnalisée et la barre de recherche,

19
jigzat

Merci @wiles duan et @Techprimate

Dans mon cas, j'ai résolu ce problème en réglant:

self.definesPresentationContext = NO;

Et implémentez les 2 méthodes suivantes dans UISearchControllerDelegate

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}
10
patrick kuang

Je l'ai corrigé dans mon cas en retirant 

definesPresentationContext = true 

Je n'ai pas encore testé s'il y avait des inconvénients à le supprimer!

6

J'ai eu le même problème et lorsque j'ai débogué l'interface utilisateur sur Xcode, j'ai constaté que la vue UISearchBar avait été déplacée vers une autre vue et que la largeur était mise à zéro.

Je l'ai corrigé en définissant la propriété definesPresentationContext de UISearchController sur false et en la fixant true pour la UITableViewController contenant.

J'ai ajouté une seule ligne à votre viewDidLoad().

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.definesPresentationContext = false    // Disable the presentation controller

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true    // This one remains the same

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
2
Yassine El Badaoui

Je n'ai pas de barre de navigation à la place d'une application. Aucun autre message SO ne m'a aidé, donc je l'ai corrigé de cette façon:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}
2
igraczech

Régler la barre de navigation de façon permanente sur translucide dans le storyboard a résolu mon problème. 

1
Per

Ça marche

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
1
Victor Gomes
sc.hidesNavigationBarDuringPresentation = false

fait le tour pour moi

lazy var searchController:UISearchController = {
        let sc = UISearchController(searchResultsController: nil)
        sc.searchResultsUpdater = self
        sc.obscuresBackgroundDuringPresentation = false
        sc.searchBar.placeholder = "Search"
        sc.hidesNavigationBarDuringPresentation = false
        return sc
    }()
0
Murat Akdeniz

Si vous souhaitez masquer votre barre de navigation et présenter le contrôleur de recherche en plein écran, définissez les éléments suivants sur votre barre de navigation et la barre de recherche ne dissappera pas:

navigationController?.navigationBar.translucent = true
0
mike.tihonchik

Aucun d'entre eux n'a fonctionné pour moi, je l'ai corrigé en utilisant ce hack

func position(for bar: UIBarPositioning) -> UIBarPosition {
    if UIDevice.current.userInterfaceIdiom == .pad {
        return .top
    } else {
        if iOSVersion <= 9 {
            return .top
        }
        return .topAttached
    }


}
0
Elsammak