web-dev-qa-db-fra.com

Problème UISearchBarController iOS 11 - Les boutons SearchBar et scope se chevauchent

Référé ici et ici . Pas de réponse dans le premier lien. Dans le deuxième lien, bien que la réponse ne soit pas acceptée, le lien vers le forum des développeurs Apple donne une erreur. 

Avant iOS 11: 

 enter image description here

iOS 11: 

 enter image description here

Note: Même appareil, même code.
Cela signifie également que toutes les applications utilisant cette fonctionnalité doivent être republiées?

12
Nitish

L'ajout de ces lignes l'a corrigé pour moi:

override func viewDidLayoutSubviews() {
    self.searchController.searchBar.sizeToFit()
}
6
Rodge

Je peux obtenir que l'apparence initiale s'affiche correctement dans iOS11 à l'aide du code suivant (selon la réponse de greg):

[self.searchController.searchBar sizeToFit];

if (@available(iOS 11.0, *)) {
    self.navigationItem.searchController = self.searchController;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
    // Fallback on earlier versions
    self.tableView.tableHeaderView = self.searchController.searchBar;
}

Toutefois, si l'application est en arrière-plan puis restaurée alors que la barre de recherche était active, l'apparence finirait par se chevaucher, comme indiqué dans la deuxième capture d'écran ci-dessus.

J'ai pu résoudre ce problème avec la solution suivante:

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    self.searchController.searchBar.showsScopeBar = NO;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.showsScopeBar = YES;
    [self.searchController.searchBar sizeToFit];
}];

(Je travaille toujours sur la manière de résoudre les problèmes de mise en page à la suite d'un changement d'orientation de l'interface lorsque la barre de recherche est active - cela finit toujours par se chevaucher.)

2
StephenT

Dans le radar déposé par Ray Wenderlich, @benck a publié cette réponse de WWDC, qui, si je ne me trompe pas, n'a pas encore été publiée.

1
Blake

J'ai rencontré le même problème sur mon application, ma solution est dans iOS 11, en utilisant une nouvelle méthode suggérée par Apple pour searchBar qui est dans navigationItem, sinon, en utilisant l'ancienne méthode. Mon code dans viewDidLoad () comme ci-dessous:

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
    searchViewHeight.constant = 0
} else {
    searchView.addSubview(searchController.searchBar)
}

J'ai deux IBOutlets: searchView et searchViewHeight:

@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11

Avant iOS 11, la hiérarchie de mon viewController est la suivante:

My searchView before iOS 11

J'ai un searchView dont la hauteur est de 44 à contient la vue searchBar de mon searchController. C'est sous la barre de navigation.

Dans iOS 11, j'ajoute un nouvel IBOutlet pour la contrainte de hauteur de searchView et lui attribue la valeur 0, masquant cette vue conteneur. Et ajoutez searchController comme élément de navigation. 

Voir le document d'Apple: https://developer.Apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

Une autre chose est sous iOS 11, la couleur de fond textField du searchBar est un peu plus sombre que la couleur de la barre de navigation par défaut. Par souci de cohérence, vous pouvez le changer en blanc, le code ci-dessous fonctionnera à la fois pour iOS11 et ses versions antérieures:

if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
    if let backgroundView = textField.subviews.first {

        // Search bar textField background color
        backgroundView.backgroundColor = UIColor.white

        // Search bar textField rounded corner
        backgroundView.layer.cornerRadius = 10
        backgroundView.clipsToBounds = true
    }
}
1
tiantong

Selon vos commentaires, votre UISearchController 's UISearchBar a été affectée à votre UITableView' s tableHeaderView. Dans iOS 11, vous devriez plutôt affecter votre UISearchController à la propriété searchController de votre vue navigationItem. Vous n'avez plus besoin d'assigner la UISearchBar n'importe où. Voir Documentation Apple sur cette nouvelle propriété.

1
greg

J'ai eu le même problème sous iOS 11.

Contrairement à certains commentaires, si je regarde vos captures d'écran, vous NE DEVEZ PAS le définir en tant que navigationItem car vous n'avez pas de configuration UINavigationController.

Vous ne voulez pas non plus ajouter la searchBar dans l'en-tête de la tableView car, pour une raison quelconque, il ne peut pas gérer la scopeBar

Donc ce que j'ai fait pour le réparer:

Pour obtenir une UISearchBar avec des étendues sur votre tableView, utilisez une UIViewController dans le générateur d'interface pas une UITableViewController.

Placez une UISearchBar et une UITableView dans le contrôleur de vue et connectez-les correctement (délégués, source de données, etc.).

N'oubliez pas de modifier également votre fichier Swift en UIViewController au lieu de UITableViewController et de le modifier en conséquence. (ajoutez une propriété tableView et connectez-la via IBOutlet, modifiez les délégués pour la tableView, etc.)

Ensuite, dans le générateur d’interface, utilisez les guides autoLayout pour que searchBar soit placé au-dessus de tableView.

 enter image description here

Dans l'interface Builder, lorsque vous activez la barre d'étendue, cela aura l'air totalement bizarre, mais ne paniquez pas, tout ira bien. Je suppose que Apple a vissé le constructeur d'interface de rendu n quand ils ont changé le comportement pour fonctionner avec UINavigationController... de toute façon ...

Ensuite, tout fonctionne comme il se doit et ressemble à ceci (dans mon cas, je présente le vc dans un popover mais peu importe)

 enter image description here

0
bnassler

Je pense que la solution consiste à ajouter la barre de recherche dans la barre de navigation: 

navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles
navigationItem.title = "Contacts"
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0)

let searchController = UISearchController(searchResultsController: nil) // Search Controller
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController

Vous trouverez un exemple pour UISearchBarController - SearchBar et les boutons de portée se chevauchent ici .

0
Amine